Connector
用于接受请求并将请求封装成Request
和Response
来具体处理,最底层是使用Socket
来进行连接的,Request
和Response
是按照HTTP协议
来封装的,所以Connector
同时实现了TCP/IP
协议和HTTP
协议。
Request
和Response
封装之后交给Container
进行处理。Container
就是Servlet
的容器。
Container
处理完之后返回给Connector
,最后Connector
使用Socket
将处理结果返回给客户端,这样整个请求就处理完了。
Connector
的结构
Connector
中具体是用ProtocolHandler
来处理请求的,不同的ProtocolHandler
代表不同的连接类型。
ProtocolHandler
里面有3个非常重要的组件:Endpoint
、Processor
和Adapter
。
- Endpoint
用于处理底层Socket
的网络连接 - 用来实现TCP/IP
协议
- Processor
用于将Endpoint
接收到的Socket
封装成Request
- 用来实现HTTP
协议
- Adapter
用于将封装好的Request
交给Container
进行具体处理 - 将请求适配到Servlet
容器进行具体处理
Endpoint
的抽象实现AbstractEndpoint
里面定义的Acceptor
和AsyncTimeout
两个内部类和一个Handler
接口。Acceptor
用于监听请求,AsyncTimeout
用于检查异步request
的超时,Handler
用于处理接收到的Socket
,在内部调用了Processor
进行处理。
Connector
的使用方法是通过Connector
标签配置在conf/server.xml
文件中,所以Connector
是在Catalina
的load
方法中根据conf/server.xml
配置文件创建Server
对象时创建的。Connector
的生命周期方法是在Service
中调用的。
Connector
的创建过程主要是初始化ProtocolHandler
。server.xml
配置文件中Connector
标签的protocol
属性会设置到Connector
构造函数的参数中。
Connector
的生命周期处理方法中主要调用了ProtocolHandler
的相应生命周期方法。
- 在initInternal
方法中首先新建了一个Adapter
并设置到ProtocolHandler
中,然后对ProtocolHandler
进行初始化;
- 在startInternal
方法中首先判断设置的端口是否小于0,如果小于0就抛出异常,否则就调用ProtocolHandler
的start
方法来启动;
- 在stopInternal
方法中先设置了生命周期状态,然后调用了ProtocolHandler
的stop
方法;
- 在destroyInternal
方法中除了调用ProtocolHandler
的destroy
方法,还会将当前的Connector
从Service
中剔除并调用父类的destroyInternal
方法。
Endpoint用于处理具体连接和传输数据