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
- Tomcat服务器的模拟实现学习解析Http协议、反射、xml解析等
- 以SpringIoc的模拟实现来学习反射和xml解析
- java解析xml模拟容器的实现 如spring等
- Tomcat的服务器配置文件server.xml解析
- Tomcat的服务器配置文件server.xml解析
- Tomcat的服务器配置文件server.xml解析
- 自己实现Http服务器:一、Http协议解析
- XML解析和HTTP协议
- Android --- Http协议,解析服务器中给定的XML文件时的权限问题
- Java实现对http协议的解析
- Java实现http协议的解析
- HTTP协议的解析
- HTTP的协议解析
- Rhyme/ 手写服务器 实现一个基于xml解析的简单的Tomcat服务器
- XML解析使用固定格式解析本地与解析Tomcat服务器上面的xml文件
- 应用层协议实现系列(二)——HTTP服务器之http协议解析
- 学习实现解析XML
- 实现简易的Struts.xml解析[内含反射的理解]
- 1503:互质个数
- 题目44-子串和
- 计蒜客-求出现次数最多的字符
- NMF 非负矩阵分解 -- 原理与应用
- 1071:不容易系列
- Tomcat服务器的模拟实现学习解析Http协议、反射、xml解析等
- Lintcode最长上升连续子序列
- #CCF准备一年日常刷题#201403-2窗口
- RTL8723BU wifi 及 热点移植和测试
- 引入JavaScript,alert弹出框显示中文乱码
- python2.x代码版本迁移至Python3.x
- Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)
- ESP8266读写flash的实现
- leetcode 128. Longest Consecutive Sequence 最长连续序列 + HashSet