java实现简单web服务器(分析+源代码)

在日常的开发中,我们用过很多开源的web服务器,例如tomcat、apache等等。现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器。为了简化操作,这里不考虑资源不存在等异常情况。web服务基于的是HTTP协议,用户在浏览器的地址栏输入要访问的地址,服务器如何得到该地址是个关键。先看下一般的HTTP请求和响应报文的一般格式:

HTTP 请求报文

HTTP 响应报文

web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

//每有一个连接建立时,服务器分出一个通信的线程
public class CommunicateThread extends Thread{
	//与客户端通信的套接字
	Socket client;

	public CommunicateThread(Socket s) {
		client = s;
	}

	//获取浏览器请求资源的路径
	public String getResourcePath(String s){
		// 一般的HTTP请求报文的第一行是“GET /index.html HTTP/1.1”
		// 我们要获取的就是中间的"/indext.apsx"

		//获取资源的位置
		String s1 = s.substring(s.indexOf(‘ ‘)+1);
		s1 = s1.substring(1,s1.indexOf(‘ ‘));

		//默认资源为index.html
		if(s1.equals(""))
			s1 = "index.html";

		return s1;
	}

	public void sendFile(PrintStream out,File file){
		try{
			DataInputStream in  = new DataInputStream(new FileInputStream(file));
			int len = (int)file.length();
			byte buf[] = new byte[len];
			in.readFully(buf);//读取文内容到buf数组中
			out.write(buf,0,len);
			out.flush();
			in.close();
		}
		catch(Exception e){
			System.out.println(e.getMessage());
			System.exit(1);
			}
	}

	public void run(){
		try{
			//获取用户的IP地址和端口号
			String clientIP = client.getInetAddress().toString();
			int clientPort = client.getPort();
			//创建输出流对象
			PrintStream out = new PrintStream(client.getOutputStream());
			//创建输入流对象
			DataInputStream in = new DataInputStream(client.getInputStream());
			//读取浏览器提交的请求
			String msg = in.readLine();

			//获取文件路径
			String fileName = getResourcePath(msg);
			System.out.println("The user asked for resource: "+fileName);
			File file = new File(fileName);

			if(file.exists()){
				//根据响应报文格式设置
				System.out.println(fileName+" start send");

				out.println("HTTP/1.0 200 OK");
				out.println("MIME_version:1.0");
				out.println("Content_Type:text/html");
				int len = (int) file.length();
				out.println("Content_Length:"+len);
				out.println("");//报文头和信息之间要空一行

				//发送文件
				sendFile(out,file);

				out.flush();
			}
			client.close();
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

}

服务器主要负责初始化套接字和线程,代码如下:

import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {

	public static void main(String[] args) {
		int Port = 12345;//端口号,由于这里是测试,所以不要使用常用端口
		//创建两个套接字
		ServerSocket server = null;
		Socket client = null;
		try{
			server = new ServerSocket(Port);
			//服务器开始监听
			System.out.println("The WebServer is listening on port "+server.getLocalPort());
			while(true){
				client = server.accept();
				//多线程运行
				new CommunicateThread(client).start();
			}
		}catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

}

运行测试:

编写一个index.html文件

<html>
<head></head>
<body>
<h1>This is the index of my WebServer</h1><hr></body>
</html>

放到项目文件的根目录,然后在浏览器地址栏输入:“localhost:12345/index.html”,就可以看到位于服务器端的html文件了。注意由于服务器是死循环,重启服务器会发现指定的端口已被绑定,只需要进入任务管理器,关闭"Java(TM) Platfrom SE binary"进程即可。最后结果如下所示:

这个服务器程序很简陋,还有很大的改进余地。大家可以自己尝试改进。这里可以尝试一下访问其他的文件,发现时成功的,说明这服务器很不安全呀。

java实现简单web服务器(分析+源代码)

时间: 2024-10-15 21:46:05

java实现简单web服务器(分析+源代码)的相关文章

基于Java实现简单Http服务器(转)

基于Java实现简单Http服务器(转) 本文将详细介绍如何基于java语言实现一个简单的Http服务器,文中将主要介绍三个方面的内容:1)Http协议的基本知识.2)java.net.Socket类.3)java.net.ServerSocket类,读完本文后你可以把这个服务器用多线程的技术重新编写一个更好的服务器.           由于Web服务器使用Http协议通信的因此也把它叫做Http服务器,Http使用可靠的TCP连接来工作,它是面向连接的通信方式,这意味着客户端和服务器每次通信

web服务器分析与设计(一)

自己写一个简单的服务器. 面向对象分析与设计第一步:获取需求(基于用例) 功能:1,支持html静态网页,2,支持常用HTTP请求,且容易扩展支持不现请求 3,可以发布站点 补充:至于对动态网页等高级功能,只要确保可扩展性就可以了. 目标系统客户角色:1,上网者 2,浏览器客户端 3,网站发布人 (暂时想到主要的这几个角色) 只要满足了他们的主要需求,这个服务器也就是成功的. 客户发起动作(用例起点):U1:上网者------>打开网站(www.xxx.com) U2:上网者------>提交

Socket实现简单Web服务器

上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 1)熟悉Socket编程: 2)熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重点在浏览器端.本篇博客则反过来讲一下怎样使用socket来实现Web服务器,怎样去接收.分析.处理最后回复来自浏览器的HTTP请求. HTTP协议是浏览器和Web服务器都需要遵守的一种通信规范,如果我们编写一个程序,正确遵守了HTTP协议,那么理论上讲,这个程序可以具备浏览器.甚至Web服务

tomcat解析之简单web服务器(图)

链接地址:http://gogole.iteye.com/blog/587163 之前有javaeyer推荐了一本书<how tomcat works>,今天晚上看了看,确实不错,第一眼就着迷了. 于是乎就学着书上的例子敲了敲,学会了一个简单web服务器的大概实现,当然,这个简直就无法称之为web服务器,但是也算是走进web服务器的第一步吧. 这篇文章仅限于学习记录,文笔凌乱之处,还望各位见谅. OK,下面进入正题: 开始之前,首先我们要清楚以下几个内容. 首先,一个最简单服务器包括三个部分:

【Web后端笔记】基于Socket实现的简单Web服务器搭建

我们在地址栏中输入的内容称为通用资源标记符(Universal Resource Identifier,URI)它有很多种样式,在Web中我们通常称为统一资源定位符(Uniform Resource Locator,URL)的形式,它的格式如下: 协议://主机[.端口号][绝对路径[?参数]] 在http://www.cnblogs.com/DebugLZQ/中,http表示协议名称;www.cnblogs.com表示主机的地址:可选的端口号没有出现,那么,将使用http协议默认的端口号80:

一个基于AIO实现的简单web服务器

一下是一个基于AIO实现的简单web服务器,这是一个简单例子 /** * 一个简单的web 服务器<br/> * 通过浏览器输入localhost:8080/访问 * * @author Joeson * @since 2014/05 * */ public class AioServer implements Runnable { private AsynchronousChannelGroup asyncChannelGroup; private AsynchronousServerSoc

Socket网络编程--简单Web服务器(1)

这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码,使用C语言.这一小节就不讲别的内容了.就对这个程序进行一些注释和讲解了. 主函数: 1 int main(void) 2 { 3 int server_sock = -1; 4 u_short port = 0; 5 int client_sock = -1; 6 struct sockaddr_

web服务器分析与设计(二)

面向对象分析与设计第二步:寻找对象,建立问题域模型 1,用例场景描述 接上一篇中的用例,编写用例场景 U1: 上网者:打开网站(www.xxx.com) 浏览器:连接网站 目标系统:接受连接 检查连接合法性(主要是因为服务端是容易受攻击的,所以需要加入安全检查) 合法,接入连接,等待HTTP请求(不合法看备选流程) 浏览器: 发送GET请求 等待回复 目标系统:收到GET请求 处理GET请求 向浏览器发回请求回复 回复完成,断开连接 备选流程:连接不合法,断开连接. U2 上网者:点击提交按钮

Python 实现简单 Web 服务器

Python 实现简单 Web 服务器 最近有个需求,就是要创建一个简到要多简单就有多简单的web服务器,目的就是需要一个后台进程用来接收请求然后处理并返回结果,因此就想到了使用python来实现. 首先创建一个myapp.py文件,其中定义了一个方法,所有的请求都会经过此方法,可以在此方法里处理传递的url和参数,并返回结果. def myapp(environ, start_response): status = '200 OK' headers = [('Content-type', 't