现在的位置: 首页 > 综合 > 正文

构建高性能的 HTTP 服务器 (一)–初涉Java HTTP 服务器

2013年04月12日 ⁄ 综合 ⁄ 共 2495字 ⁄ 字号 评论关闭

简介:

 
Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。

一:浏览器的请求头

   下面是Firefox浏览器,GET请求的数据头:

GET / HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

/r/n

在没个换行后面都有一个"\r\n",在最后一行的下面还有还有一个"\r\n"

   POST请求的数据头:

  略


二:HTTP服务器响应数据的头

自定义服务器,的基本的响应的数据头

HTTP/1.1 200 OK
Content-Type:text/html
Content-Length:6

/r/n

在没个换行后面都有一个"\r\n",在最后一行的下面还有还有一个"\r\n"

其中上面的Content-Length参数是必不可少的,其指定的是HTTP响应的正文的长度,在浏览器上面,就会根据这个参数,知道这个HTTP数据流的结束点。(在编写HTTP的代理服务器的上面,一定要注意这点。)

三、Java代码实现一个简单的HTTP服务器。

     设置端口为8080 ,新建了个线程池,池的大小为8。当请求到来时,所有响应的数据,都是Hello !

public class MyServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MyServer().startHttp();
	}

	private void startHttp() {
		// TODO Auto-generated method stub
		try {
			ServerSocket serverSocket = new ServerSocket(8080);
//			初始化一个线程池
			ExecutorService executorService = Executors.newFixedThreadPool(8);

			System.out.println("打开服务!");

			Socket socket;
			while (true) {
				socket = serverSocket.accept();
				executorService.execute(new Handler(socket));
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	class Handler implements Runnable {

		Socket socket;

		public Handler(Socket socket) {
			// TODO Auto-generated constructor stub
			this.socket = socket;
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("端口号" + socket.getPort());
			try {
				InputStream inputStream = socket.getInputStream();
				OutputStream outputStream = socket.getOutputStream();
				
				
				//读取浏览器的头中包含的数据
				byte buffer[] = new byte[inputStream.available()];
				
				int i = -1;
				inputStream.read(buffer);
				String readHead = new String(buffer);

				System.out.println("请求的浏览器的数据:\n" + readHead + "\n________\n");

				

				

				String string = "Hello!";

//				设置响应数据的头
				String split = "\r\n";
				StringBuffer stringBuffer = new StringBuffer();
				stringBuffer.append("HTTP/1.1 200 OK\r\n");
				stringBuffer.append("Content-Type:text/html" + split);
				stringBuffer
						.append("Content-Length:" + string.length() + split);
				stringBuffer.append("\r\n");
				stringBuffer.append(string);

				System.out.println("响应的数据"+stringBuffer.toString());
				outputStream.write(stringBuffer.toString().getBytes());

				outputStream.flush();
				outputStream.close();
				socket.close();

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

}

四:效果图

浏览器:


服务器控制台:

参考:

POST的讨论    http://bbs.csdn.net/topics/310107460

WEB 服务器定义  http://baike.baidu.com/view/460250.htm

抱歉!评论已关闭.