最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Tomcat

IT圈 admin 17浏览 0评论

Tomcat

Connector组件是Tomcat两个核心组件之一(另一个是Container),主要任务是负责接收客户端发过来的TCP连接请求,创建一个Request和Response对象用于和请求端交换数据。

Connect类图关键属性和方法

ProtocalHandler是协议处理器接口,不同的协议各自实现,类图如下:

Connector 源码:

//1
public Connector(String protocol) {setProtocol(protocol);Class<?> clazz = Class.forName(protocolHandlerClassName);//2this.protocolHandler = (ProtocolHandler) clazz.newInstance();}//主要属性
protected ProtocolHandler protocolHandler = null;
protected Adapter adapter = null;
protected MapperListener mapperListener = new MapperListener(mapper, this);@Overrideprotected void initInternal() throws LifecycleException {super.initInternal();// Initialize adapteradapter = new CoyoteAdapter(this);//protocolHandler 设置适配器protocolHandler.setAdapter(adapter);protocolHandler.init();mapperListener.init();}@Overrideprotected void startInternal() throws LifecycleException {setState(LifecycleState.STARTING);protocolHandler.start();mapperListener.start();}

从源码中可以看到,初始化时调用方法 initInternal,创建Adapter(CoyoteAdapter)并将Adapter赋值给ProtocolHandler
ProtocolHandler初始化会调用对应Endpoint的初始化即bind,这样就可以开始在绑定指定地址和端口准备监听请求。

1处创建protocolHandler
ProtocolHandler负责根据具体的协议和I/O模型对请求数据进行接受,解析和处理,ProtocolHandler创建并委托Endpoint进行具体的处理。Endpoint经过一层处理后将请求传入Processor,最终由Processor将请求传入Adapter进而进入容器。

Connector初始化过程:

Coonector构造函数

涉及到相关源码如下:

// org.apache.coyote.AbstractProtocol#initendpoint.init();//org.apache.tomcat.util.net.AbstractEndpoint#initpublic final void init() throws Exception {if (bindOnInit) {bind();bindState = BindState.BOUND_ON_INIT;}}//org.apache.tomcat.util.net.NioEndpoint#bind
public void bind() throws Exception {serverSock = ServerSocketChannel.open();serverSock.socket().bind(addr,getBacklog());if (oomParachute>0) reclaimParachute(true);selectorPool.open();
}    

Connector中几个重要对象:

CoyoteAdapter:

Tomcat使用Apache Coyote库来处理网络I/O的。
Adapter位于Coyote框架处理请求的末端,解析和得到的org.apache.coyote.Request和org.apache.coyote.Response将会传入Adapter,因此它作为Connector的适配器又可以访问到Tomcat组件包括容器,因此可以最终将请求传入Tomcat的核心容器中。

方法:org.apache.catalina.connector.CoyoteAdapter#service

// 创建request ,response
request = connector.createRequest();
request.setCoyoteRequest(req);
response = connector.createResponse();
response.setCoyoteResponse(res);// Link objects
request.setResponse(response);
response.setRequest(request);
// Calling the container, 讲请求消息传递给管道第一个阀门。
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);

注意:
connector包中的Request才是真正Servlet容器中的HttpServletRequest,它里面包含了完成请求需要的host,context和wrapper信息,在这里每一个wrapper其实都对应web.xml配置的一个Servlet。

Tomcat

Connector组件是Tomcat两个核心组件之一(另一个是Container),主要任务是负责接收客户端发过来的TCP连接请求,创建一个Request和Response对象用于和请求端交换数据。

Connect类图关键属性和方法

ProtocalHandler是协议处理器接口,不同的协议各自实现,类图如下:

Connector 源码:

//1
public Connector(String protocol) {setProtocol(protocol);Class<?> clazz = Class.forName(protocolHandlerClassName);//2this.protocolHandler = (ProtocolHandler) clazz.newInstance();}//主要属性
protected ProtocolHandler protocolHandler = null;
protected Adapter adapter = null;
protected MapperListener mapperListener = new MapperListener(mapper, this);@Overrideprotected void initInternal() throws LifecycleException {super.initInternal();// Initialize adapteradapter = new CoyoteAdapter(this);//protocolHandler 设置适配器protocolHandler.setAdapter(adapter);protocolHandler.init();mapperListener.init();}@Overrideprotected void startInternal() throws LifecycleException {setState(LifecycleState.STARTING);protocolHandler.start();mapperListener.start();}

从源码中可以看到,初始化时调用方法 initInternal,创建Adapter(CoyoteAdapter)并将Adapter赋值给ProtocolHandler
ProtocolHandler初始化会调用对应Endpoint的初始化即bind,这样就可以开始在绑定指定地址和端口准备监听请求。

1处创建protocolHandler
ProtocolHandler负责根据具体的协议和I/O模型对请求数据进行接受,解析和处理,ProtocolHandler创建并委托Endpoint进行具体的处理。Endpoint经过一层处理后将请求传入Processor,最终由Processor将请求传入Adapter进而进入容器。

Connector初始化过程:

Coonector构造函数

涉及到相关源码如下:

// org.apache.coyote.AbstractProtocol#initendpoint.init();//org.apache.tomcat.util.net.AbstractEndpoint#initpublic final void init() throws Exception {if (bindOnInit) {bind();bindState = BindState.BOUND_ON_INIT;}}//org.apache.tomcat.util.net.NioEndpoint#bind
public void bind() throws Exception {serverSock = ServerSocketChannel.open();serverSock.socket().bind(addr,getBacklog());if (oomParachute>0) reclaimParachute(true);selectorPool.open();
}    

Connector中几个重要对象:

CoyoteAdapter:

Tomcat使用Apache Coyote库来处理网络I/O的。
Adapter位于Coyote框架处理请求的末端,解析和得到的org.apache.coyote.Request和org.apache.coyote.Response将会传入Adapter,因此它作为Connector的适配器又可以访问到Tomcat组件包括容器,因此可以最终将请求传入Tomcat的核心容器中。

方法:org.apache.catalina.connector.CoyoteAdapter#service

// 创建request ,response
request = connector.createRequest();
request.setCoyoteRequest(req);
response = connector.createResponse();
response.setCoyoteResponse(res);// Link objects
request.setResponse(response);
response.setRequest(request);
// Calling the container, 讲请求消息传递给管道第一个阀门。
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);

注意:
connector包中的Request才是真正Servlet容器中的HttpServletRequest,它里面包含了完成请求需要的host,context和wrapper信息,在这里每一个wrapper其实都对应web.xml配置的一个Servlet。

发布评论

评论列表 (0)

  1. 暂无评论