Tomcat服务器的模拟实现学习解析Http协议、反射、xml解析等

来源:互联网 发布:旧手机改网络机顶盒 编辑:程序博客网 时间:2024/06/08 19:13

模拟tomcat机制手写一个简单的Tomcat服务器,主要功能有可以获得请求参数,还可以对浏览器做出响应,底层采用http协议,通过用户请求信息,解析请求信息,并且封装了响应信息,可以向浏览器响应网页,也可以响应文字,原理就是通过IO流读取本地网页信息,将其转化为字符串输出到浏览器。并且可以针对每一个请求,服务器都会分发一个单独的线程区处理他。
核心代码如下:
源码在最底部。
源码结构:
这里写图片描述
服务器端:

public class Server {    ServerSocket server;    public static final String CRLF="\r\n";    public static final String BLANK=" ";    private boolean isShutDown= false;    public static void main(String[] args) {        Server s = new Server();        s.start();    }    /**     * 启动方法     * */    public void start() {        start(8888);    }    /**     *指定端口的启动方法      * @param i     */    public void start(int port) {        try {            server = new ServerSocket(port);            this.recive();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    /**     * 接受客户端的请求     */    private void recive() {        try {            while(!isShutDown) {                new Thread(new Dispatcher(server.accept())).start();            }        } catch (IOException e) {            Stop();    }}    /**     * 停止服务器     */    private void Stop() {        isShutDown = true;              CloseUtil.closeSocket(server);    }}

下面是分发器:

/** * 一个请求与响应就一个此对象 *@author 莱格 */public class Dispatcher implements Runnable {    private Socket client;    private Request req;    private Response rep;    private int code =200;//状态码默认为200    /**     * 构造一个分发器     * @param accept     */    public Dispatcher(Socket client) {        this.client = client;        try {            req = new Request(client.getInputStream());            rep = new Response(client.getOutputStream());        } catch (IOException e) {            code = 500;            return;        }    }    @Override    public void run() {        try {//          Servlet serv = WebApp.getServlet(req.getUrl());            Servlet serv = ServletFactory.getServlet(req.getUrl());            System.out.println(req.getUrl());//          if (req.getUrl() == ParseWebXml.readDocument().) {//              //          }            if (null == serv) {                this.code = 404;            }else {                serv.service(req, rep);            }            rep.pushTOClient(code);        } catch (Exception e) {            e.printStackTrace();            this.code = 500;            try {                rep.pushTOClient(500);            } catch (IOException e1) {                // TODO Auto-generated catch block                e1.printStackTrace();            }            req.close();            rep.close();            CloseUtil.closeSocket(client);        }    }}

解析http协议的请求信息,给出源码结构,
这里写图片描述
封装了响应信息:
这里写图片描述

抽象一个servlet父类,通过继承此servlet,重写相应的方法,就可以完成相应的业务。

/** *  * 抽象为一个父类 *@author 莱格 */public abstract class Servlet {    public void service(Request req,Response rep) throws Exception{        this.doGet(req, rep);        this.doPost(req, rep);    }    protected abstract void doGet(Request req,Response rep) throws Exception;    protected abstract void doPost(Request req,Response rep) throws Exception;}

以下是解析web.xml源码结构。

这里写图片描述

整体的大概源码结构解释这样!

接下来,把此服务器打成j可执行的jar包,跑一个登录注册案例。
下面是登录注册案例的整体项目结构:
这里写图片描述
其中里面的springIoc.jar是楼主模拟springIoc的思想,自定义的一个简易springIoc容器.

接下来是案例演示:
这里写图片描述
这里写图片描述

用wanger登录
这里写图片描述
这里写图片描述

至此,整个小demo就跑完了。
下面贴出源码:
http服务器源码下载
案例代码:httpserver里面好像也附带了一个小demo,也可以自己写很简单的。
上述代码里面的springioc源码

阅读全文
0 0
原创粉丝点击