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

时间:2022-02-04 19:51:42

简介:

  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();
}

}

}

}

四:效果图

浏览器:

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

服务器控制台:

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


参考:

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

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