Catalina 中有两个主要的模块:连接器和容器
连接器:httpConnector:创建一个服务器套接字,获取到http请求,accept方法创建socket,创建HttpProcessor 实例,把socket接受的数据作为入参传给HttpProcessor.process
HttpProcessor 类的 process 方法接受前来的 HTTP 请求的套接字,会做下面的事情:
创建一个 HttpRequest 对象。
创建一个 HttpResponse 对象。
解析 HTTP 请求的第一行和头部,并放到 HttpRequest 对象。
解 析 HttpRequest 和 HttpResponse 对 象 到 一 个 ServletProcessor 或 者 StaticResourceProcessor,
ServletProcessor调用被请求的servlet的service
默认连接器:逻辑类似,连接器是通过调用接口 org.apache.catalina.Container 的 invoke 方法来传递 request 和 response 对象的,invoke实例化servlet,调用servlet的service方法
持久连接是 HTTP1.1 的默认连接方式,长连接通过块编码指定长度(),也可content-length(知道内容长度情况下)
HttpConnector 维护一个 HttpProcessor 的实例池,setContainer 是用来关联连接器和容器用的。HttpProcessor解析请求行和头部,并填充请求对象,接着调用Container容器的 invoke 方法的。
请求流程:
1.http请求到tomcat。
2.tomcat的HttpConnector实例化创建一个serverSocket监听。HttpConnector实例化会关联Container 容器,同时HttpConnector 维护一个 HttpProcessor 的实例池。
3.接收到连接调用accept方法,创建socket。
4.创建的socket接受到请求,把请求套接字转换为request和reponse封装,从维护的HttpProcessor实例池获取HttpProcessor,解析request请求行和头部,并填充请求对象。
5.HttpProcessor调用Container容器的 invoke方法,实例化servlet,调用servlet的service方法