用Java实现简单的HTTP服务器(二)
上次我们讲了一些关于HTTP报文的基础知识,接下来我们就讲用Java如何实现
1. 内容分析:
实现一个对于HTTP协议的解析程序,对于HTTP的GET/POST请求进行分析,并给出回应。通过监听端口,实现对本地数据的获取。
2. 需要学习的主要知识
Java的ServerSocket库,Socket库的基本应用。Java基本用法,Java字符串解析。Jframe的简单使用。
3. 实验方案
1. 首先我们建立一个服务端,来监听端口,并接受HTTP请求
2. 之后我们编写一个请求处理类,来对我们接收到的HTTP请求进行分析和处理,获取HTTP报文中信息,并对请求信息进行处理
3. 用Jframe实现一个UI界面,来设置我们获取资源的路径,已经存储资源的路径,最后将frame与server进行关联
4.实验步骤
1. 因为我们要实现多线程,所以我们的Server类应该实现Runable来实现多线程。之后我们新建一个ServerSocket对象,来处理我们监听的端口。在while循环中,我们对于监听端口进行accpet(阻塞),直到我们检测到数据过来。有报文传送过来之后,我们将传送过来的报文发送给RequestExecute(数据处理)中,对于报文做进一步的解析。
-
我们的RequestExecute也应该继承线程类,实现多线程的操作。一个常规的HTTP报文在上篇文章我们已经讲过,报文的第一行是HTTP的版本号,一般为1.1;之后是请求的URL地址,之后是请求的方法,一般为GET/POST;再接下来是相应的状态码,一般有200,404等;之后是一些压缩格式,文本解析的格式等等……
因此对于字符串的解析如下:
a) 首先取出报文的一行,其中如果没有HTTP,则并不是HTTP请求,对其忽略
b) 之后对于第二行,取出Host后的内容,这个就是报文要请求的题内容,我们将其保存下来
c) 对于请求的内容分为请求的路径,请求的内容格式以及请求的文件名称,我们对于不同的格式采取不同的响应方式:
1) 如果按照所给路径没有找到相应的资源,则响应404,跳转到错误页面
2) 如果找到相应的资源,返回资源,响应状态码200(其中不同的资源响应的方式不同,例如:图片格式如jpg, png等用字节流进行输出,文本格式如txt, markdown, html等用字符流进行输出)
d) 对于我们监听的端口,写了一个简单的页面
-
之后我想对于我们的服务器,用Jframe写一个简单的UI,来关联我们的Server。首先设置一些按键,文本框等装饰,之后进行一些功能的事件关联,比如启动服务,停止服务,输出日志等
5. 一些参考资料
http://edyfox.codecarver.org/html/java_tutor_httplite.html(可能需要翻墙)
https://www.bilibili.com/video/BV1T7411F7hT(手把手教学)
https://www.bilibili.com/video/BV14J4114768(一些前端教程)
6.我的源码
https://github.com/1190200610/HTTPServer
对于代码中的任何细节可以在评论区问我