Java 实现简单的Http服务器

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 14:08   11   0

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("<h1>hello!</h1>".getBytes());
    os.write("<h3>HTTP服务器!</h3>".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, 会出现下面的页面:


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP