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用于处理具体连接和传输数据