基础知识整理
手写一个仿Tomcat的服务器需要一些基本的基础知识,不需要掌握的有多高深,但是需要知道如何使用,最基础的Java语法这里就不再赘述,只大略的列举一下一些高级的知识点。
1、计算机网络知识:TCP、http
tcp是一种需要保持连接的网络协议,http是在建立了tcp连接的基础上,按照一定的语法书写相关的内容,可以理解为http就是一种模板,大家都按照这个模板书写要传输的信息,那样处理起来就没有限制了,可以自由的连接和通信。
2、Java反射
反射是Java高级中的一个知识点,通过Class类和一个类的类名,可以获得一个类的所有信息,比如构造方法,属性,注解等等,在这里我们使用反射来动态的创建某一个类的对象。
3、xml解析
xml是一种文件格式,在这个小项目中,我们在web.xml文件中配置每一个servlet的信息,xml文件的解析方法上一篇文章已经写过了,不懂的可以去看。
手写服务器
首先要理解一个服务器的本质,本质就是将一个设备的端口的tcp连接包装起来,对每一个连接和传输信息过程进行封装,让程序开发者不需要关注端口,数据解析,文件找不到等等的问题,只需要关注信息的内容。
结构划分
一个完善的服务器有很多的结构,这里我只写一个最简单的服务器,所以不会有什么优化的内容,只需要实现基本的功能就可以了。所以可以将一个服务器分为两个部分
第一个部分是网络的连接和传输部分,包括:接收客户端建立连接的请求,对客户端发来的http报文进行解析,将服务端要发送的信息进行封装,包装成一个http报文并将其返回给客户端。对一些错误情况进行处理,为每一个新建立的连接分配一个线程,主线程接着为其他客户端建立连接。
第二个部分是解析xml文件,为用户动态创建对象。包括:解析xml文件,通过url找到对应的类,使用反射机制创建对象并执行
代码解释
整个服务器可以简化为以下几类代码
- web.xml 用户在这里配置自己的servlet及其对应的url信息
- WebHandler.java 解析xml文件时需要使用的处理器
- WebContext.java 构建每一个url和其对应的servlet的Map
- WebApp.java 解析xml文件,构建servlet实例,对外提供方法
- Entity.java servlet路径及其名字的bean类
- Mapping.java servlet名字及其对应的url的bean类
- Servlet.java 接口,每一个servlet都要实现这个接口,这个接口作为servlet的引用类型
- server.java 创建一个服务器端的tcp连接对象,使用ServerSocket类。为每一个连接分配新的线程
- Dispatcher.java 线程对象,管理一个socket连接,server为每一个连接都分配一个Dispatcher线程
- Request.java 封装请求报文,解析请求报文中的参数
- Response.java 封装响应报文,用户只管向response中输入信息,response自动将信息封装成响应http报文
代码在这里:链接: https://pan.baidu.com/s/1My2bINrgklfYBKVfogG-mw 提取码: p9f4