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(连接器)相关推荐

  1. tomcat Connector 连接器

    连接器的核心功能,本文去除非核心功能,留下整个程序的框架,便于理解. 1.接受连接请求 2.创建request,和response. 3.调用容器对应的Invoke方法, 首先看类的依赖结构. 1.C ...

  2. 《How Tomcat Works》读书笔记(三)--Connector(连接器)

    <How Tomcat Works>读书笔记(三)--Connector(连接器) 这是<How Tomcat Works>第三四章的读书笔记.主要写了Tomcat4.0默认的 ...

  3. tomcat(3)连接器

    [0]README 0.1)本文部分内容转自"深入剖析tomcat",旨在学习 tomcat(3)连接器 的基础知识: 0.2)Catalina 中有两个主要的模块:连接器(Ser ...

  4. 修改Tomcat Connector运行模式,优化Tomcat运行性能

    这篇博客写得很好,记下来了:http://www.cnblogs.com/freeweb/p/6430053.html http://blog.csdn.net/xyang81/article/det ...

  5. 【Tomcat】Tomcat Connector的三种运行模式【bio、nio、apr】

    Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运行模式 bio bio(blocking I/O,阻塞式I/O操作),表示Tomcat使用的是传统的Java I/O ...

  6. Tomcat Connector的三种运行模式【bio、nio、apr】

    Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运行模式 bio bio(blocking I/O,阻塞式I/O操作),表示Tomcat使用的是传统的Java I/O ...

  7. 大厂面试真题解读:Tomcat的连接器是如何设计的?

    导读 为什么要学习Tomcat的设计思路,对我们这些 crud 工程师有用吗?现代背景下,我们不仅可以学到Tomcat的架构,学会从宏观上怎么去设计一个复杂系统,怎么设计顶层模块,以及模块之间关系. ...

  8. 8080:The Tomcat connector configured to listen on port 8080 failed to start 的解决办法

    问题再现: 控制台最后会显示Application启动失败,如下: ...*************************** APPLICATION FAILED TO START ******* ...

  9. Tomcat Connector

    Tomcat是最常用的web容器之一,Tomcat Connector有bio.nio.apr三种运行模式: Tomcat运行模式: bio bio(blocking I/O),顾名思义,即阻塞式I/ ...

  10. httpd +jk_虚拟主机+ Apache httpd服务器+ Tomcat + mod_jk连接器

    httpd +jk 在上一篇文章( Tomcat中的虚拟主机 )中,我们讨论了如何在Tomcat中设置虚拟主机. 它具有成本效益,因为仅一个公共IP即可托管多个域. 如果我们有大型组织,并且每个部门都 ...

最新文章

  1. oc45--多对象内存管理 优化
  2. 企业 SpringBoot 教程(六)springboot整合mybatis
  3. react部署之页面空白
  4. 远程扫描iPhone相册?苹果的好心网友不领情
  5. java常见面试题总结
  6. mysql 不停机_mysql之 mysql 5.6不停机主从搭建(一主一从基于日志点复制)
  7. Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例
  8. Unity根据电脑高中低配置加载不同模型
  9. day69-oracle 22-DBCA
  10. ife2015 深度克隆题目
  11. LINQ 学习笔记8
  12. Win Server 8中的利器:微软在线备份服务
  13. Postman 导出 curl命令 到命令行运行 Mac OS
  14. 服务器远程ghost,Ghost win7系统64位远程桌面连接教程
  15. 微信小程序——订阅号和服务号区别
  16. 相机等效焦距和视场角计算
  17. 程序化交易逆境中的奋斗史!
  18. 常见荧光染料修饰多种基团及其激发和 发射波长数据一览数据
  19. [论文阅读笔记12]An Effective Transition-based Model for Discontinuous NER
  20. wp文件转shp_完美实现从mapGIS文件转换成ArcGIS中shp格式文件

热门文章

  1. 英特尔重入代工行业的底气和挑战,台积电,三星有点慌。
  2. 【pytorch】torchvision.transforms 图像的变换详解;图像的预处理;数据增强
  3. Java字符串:getBytes() 方法
  4. 画论25 黄休复《益州名画录》
  5. 把对象按照ASCII码排序
  6. 可视化项目使用vw/vh布局进行适配
  7. C语言练习题的错题集
  8. “富贵树”身价十五万,湖南小伙返乡创业,一年卖出800多万
  9. MTK androiod5.1源码精简系统APP
  10. MySQL之InnoDB主键索引的B+树的高度计算