Java 实现简单的Http服务器

Java 实现简单的Http服务器

      首先需要说明的是,这个HTTP服务器真的超级简单,简单到只有一个Java类,它只能返回一个特定的HTML文本。写这个HTTP服务器程序是为了探究Web服务器到底是如何提供HTTP服务的。

      要搞清这个问题,你最好先简单了解一下HTTP协议,起码要知道HTTP请求和HTTP响应是什么,HTTP报文格式是怎样的。HTTP报文有两种:请求报文和响应报文。下面是一个HTTP请求和响应的例子:

     http请求报文:

GET /index.html HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
     http响应报文:

HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xbaf943340000cca5
Bduserid: 0
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Cxy_all: baidu+5c56245ad78bbac065489e9b188e9ec3
Date: Fri, 02 Feb 2018 02:45:23 GMT
Expires: Fri, 02 Feb 2018 02:44:33 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=25641_1448_25548_21096_17001_20929; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Vary: Accept-Encoding
X-Powered-By: HPHP
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
      报文的第一行叫做起始行或者首行,请求报文的起始行叫做请求行,响应报文的起始行叫做响应行。HTTP报文的每一行结尾都有一个CRLF(回车换行符\r\n)。

      现在HTTP相关知识介绍完毕,看代码实现:

    

package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class HTTPServer {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(8080, 10);
			while (true) {
				Socket socket = serverSocket.accept();
				InputStream is = socket.getInputStream();
				is.read(new byte[2048]);
				//is.close();
				OutputStream os = socket.getOutputStream();
				
				os.write("HTTP/1.1 200 OK\r\n".getBytes());
				os.write("Content-Type:text/html;charset=utf-8\r\n".getBytes());
				os.write("Content-Length:38\r\n".getBytes());
				os.write("Server:gybs\r\n".getBytes());
				os.write(("Date:"+new Date()+"\r\n").getBytes());
				os.write("\r\n".getBytes());
				os.write("

hello!

".getBytes()); os.write("

HTTP服务器!

".getBytes("utf-8")); os.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } } }
    简单解释:

     ServerSocket类能够创建一个服务器端Socket,可以监听请求,有请求到达时自动接受,并返回一个对方的Socket对象,你可以根据这个Socket获取客户端的输入流,从而解析请求(这儿并没有这么做)。还可以获取响应流,返回数据作为响应。更多关于ServerSocket和Socket类的资料,请自行查找。

    我们通过os.write向输出流写入了一些数据,特别注意每一个字符串结尾都有一个‘\r\n’,就是前面说的CRLF回车换行符,这个是必须有的。最终关闭socket连接。

   运行程序,打开浏览器,输入http://localhost:8080, 会出现下面的页面:

   Java 实现简单的Http服务器_第1张图片

    


你可能感兴趣的:(Java)