本文仅仅是实现一个功能非常有限的http服务器。我仅仅实现了请求一个html和请求一个jpg图片。方式只支持GET。不支持http选项。错误代码仅仅会返回200 400 404.支持xml对服务器的配置。本博客内容仅仅完全处于自身娱乐,高手可直接略过。
实现思想
1用java的sax解析服务器配置文件。确定web服务器的root目录,和web服务器运行的端口号。
2启动一个serverSocket等待链接
3获取一个链接之后把所获得的socket传递给新的httpSolver线程。httpSolver负责解析客户端发来的http请求头。
4如果httpSolver根据服务器请求的文件建立一个HttpMessage类。这个类封装了http请求的消息,包括请求的文件,root目录等等。这个httpMessage传递给GetDisk类
5GetDisk负责从硬盘读取。如果java发现请求的文件不在,那么在返回404.如果请求文件成功那么构造消息头返回200在返回锁请求文件。
6httpSolver关闭socket结束一个回话。
工程文件管理方式
xml配置文件
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server SYSTEM "server.dtd">
<server>
<port>80</port>
<root>d:\Root\</root>
</server>
server.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT server (port,root?)>
<!ELEMENT port (#PCDATA)>
<!ELEMENT root (#PCDATA)>
Main.java
Main.java
package httpServer;
public class Main {
public static void main(String args[])
{
ServerClass myServer=new ServerClass();
myServer.serverStart();
}
}
ServerClass.java
public class ServerClass {
private ServerSocket serverSocket;
private String root;
private boolean runing;
private int port;
public ServerClass()
{
runing=false;
SAXParserFactory saxpf=SAXParserFactory.newInstance();
SAXParser saxParser;
try (InputStream in=new FileInputStream("server.xml"))
{
saxParser=saxpf.newSAXParser();
saxParser.parse(in, new Handler());
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("server.xml no find");
e.printStackTrace();
}
catch (Exception e) {
// TODO Auto-generated catch block