Connector是使用了socket来进行连接,它接收请求并将他们封装成request和response对象来处理。Request和Response封装之后交给Container处理,Container就是servlet容器,处理之后再返回给Connector,最后Connector在使用socket将处理结果返回给客户端,这样请求就完成了。
Connector在创建时创建ProtocolHandler,然后在生命周期的相关方法中调用ProtocolHandler的相关生命周期方法。Connector的使用方法是通过Connector标签配置在conf/server.xml的文件中。
Connector的结构图如下
ProtocolHandler--用于处理请求,不同的protocolhandler代表不同的连接类型。protocolhander有一个抽象实现类AbstractProtocol, AbstractProtocol下有三种类型:Ajp,Http和Spdy.
Endpoint--用于处理socket连接
Processor--用于将endpoint接收的socket封装成request和response.
Adapter--用于将request和response对象传给container.
其中Endpoint继承自AbstractEndpoint,它里面定义了Acceptor和AsyncTimeout两个内部类和一个Handler接口。
Acceptor用于监听请求
AsyncTimeout用于检查异步request的超时
Handler用于处理接收到的socket,再调用processor进去处理
结构如下:
来做一个简单的webserver吧
我们需要:
1.一个启动类Bootstrap
2. Connector(这个例子主要说它)
HttpConnector
HttpProcessor
HttpRequest
HttpResponse
1. HttpProcessor
它要做的是创建一个HttpRequest,一个HttpResponse,解析Http请求的url和head,并给httpRequest对象。如果是要处理一个servlet就调用ServletProcessor就调用servlet的service方法.如果请求的是静态资源,就通过StaticResourceProcessor发送静态资源
public void process(Socket socket) {
SocketInputStream input = null;
OutputStream output = null;
try {
input = new SocketInputStream(socket.getInputStream(), 2048);
output = socket.getOutputStream();
// create HttpRequest object and parse
request = new HttpRequest(input);
// create HttpResponse object
response = new HttpResponse(output);
response.setRequest(request);
response.setHeader("Server", "Pyrmont Servlet Container");
parseRequest(input, output);
parseHeaders(input);
//check if this is a request for a servlet or a static resource
//a request for a se