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

来源:互联网 发布:珂润洗发水 知乎 编辑:程序博客网 时间:2024/05/17 05:53

简介:

  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 stubnew MyServer().startHttp();}private void startHttp() {// TODO Auto-generated method stubtry {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 blocke.printStackTrace();}}class Handler implements Runnable {Socket socket;public Handler(Socket socket) {// TODO Auto-generated constructor stubthis.socket = socket;}@Overridepublic void run() {// TODO Auto-generated method stubSystem.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 blocke.printStackTrace();}}}}

四:效果图

浏览器:


服务器控制台:



参考:

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

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


原创粉丝点击