默认连接器

一、UML图:

1、所有的连接器都要实现Connector接口,必须创建Request对象和Response对象,httpConnector作为默认连接器,肯定也是要实现Connector接口的,同时httpConnector. createRequest方法创建了Request对象,httpConnector. createResponse方法创建了Response对象;

2、httpConnector接收到客户端请求后,解析请求参数、解析请求header信息、创建Response和Request对象如果放在Connector里面处理,势必会影响到后续其他客户端请求的及时响应,因此tomcat采取了HttpProcessor对象来进行这些后续处理,而且HttpProcessor是在单独的线程里面运行,不会卡住主线程,再有新的客户端请求到达时,会创建新的HttpProcessor对象并开启新的线程运行,这样就能保证连接器能高效及时的响应客户端请求;

3、httpConnector类维护着一个HttpProcessor的实例池,同时还有池的最小和最大个数的变量,如下:

在start方法启动连接器时,会初始化minProcessors个HttpProcessor对象放到processors池子里面:

创建HttpProcessor对象时,如果池子里有未使用的HttpProcessor对象,则直接从池子里面取,如果当前正在运行的HttpProcessor对象大于最大个数,则丢掉请求不处理,否则创建一个HttpProcessor对象并放到池子里,然后返回这个HttpProcessor对象:

1、Request对象封装了客户端的请求信息,Response对象封装了返回给客户端的响应信息;

2、HttpRequestImpl类是Request接口的实现类,cookies数组成员变量存储了请求的cookie信息,headers变量是一个hashMap类型,存储了请求head信息的键值对,parameters存储了相关参数的键值对,这是一个ParameterMap类型的hash表类型,比hashMap封装扩展了锁定属性;

3、为避免servlet程序员拿到request对象,因为权限过大而造成安全问题,这里采用了门面模式封装了一个HttpRequestFacade对象,其所有功能都委托给Request对象实现,但是HttpRequestFacade提供的接口有限,将其提供给servlet程序员不会造成安全问题;

4、同样的,HttpResponseImpl类是Response接口的实现类,HttpResponseFacade作为HttpResponseImpl的门面对象提供给servlet程序员使用,从而很好的解决了安全性问题;

二、流程分析:

1、httpConnector连接器实现了Runnable接口,也就是说他是运行在一个线程里面的,run方法作为线程的运行方法,首先调用ServerSocketFactory.createSocket创建一个ServerSocket对象,并且默认在8080端口上监听,然后调用ServerSocket.accept在8080端口等待客户端请求并阻塞线程;

2、如果有客户端连接请求到达,则httpConnector从accept处返回,然后调用CreateHttpProcessor创建HttpProcessor对象;

3、在创建HttpProcessor对象时,在HttpProcessor构造函数里面创建HttpRequest对象和HttpResponse对象;

4、httpConnector在调用CreateHttpProcessor后,会将服务器与客户端连接的socket对象赋值给HttpProcessor对象,然后调用HttpProcessor.start方法,由于HttpProcessor也实现了Runnable接口,因此在start方法里面就将HttpProcessor放到线程里运行;

5、HttpProcessor线程的run方法里面,首先获取刚才赋值的socket对象(如果socket为null则会阻塞到socket被赋值),然后对request请求调用parseConnection, parseRequest, parseHeaders解析请求信息并设置request的成员变量;

6、最后将request和response对象传递给Container.invoke方法,将后续的请求处理交给Container容器处理;

tomcat源码阅读之默认连接器的更多相关文章

  1. Tomcat源码阅读(二)初始化

    近来,我开始阅读tomcat的源码,感觉还挺清晰易懂:为了方便理解,我参考了网上的一些文章,把tomcat的组成归纳一下:整个tomcat的组成如下图所示: Tomcat在接收到用户请求时,将会通过以 ...

  2. tomcat源码阅读之载入器(Loader)

    一.Java类的载入器: 双亲委派模型: 1.JVM提供了三种类型的类加载器:引导类载入器(bootstrap class loader).扩展类载入器(extension class loader) ...

  3. tomcat源码阅读

    1      工具准备 需要SVN.Maven.JDK.Eclipse.Eclipse M2插件 2      下载源码及发布包 源码在这里:http://svn.apache.org/repos/a ...

  4. tomcat源码阅读之过滤器

    一.Servlet过滤器: 1.介绍: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用. Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request ...

  5. tomcat源码阅读之SingleThreadModel

    一.接口简介: 实现了SingleThreadModel接口的servlet类只能保证在同一时刻,只有一个线程执行该servlet实例的service方法,在tomcat实现中会创建多个servlet ...

  6. tomcat源码阅读之BackupManager

    一. 配置: <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOpti ...

  7. tomcat源码阅读之Server和Service接口解析

    tomcat中的服务器组件接口是Server接口,服务接口是Service,Server接口表示Catalina的整个servlet引擎,囊括了所有的组件,提供了一种优雅的方式来启动/关闭Catali ...

  8. tomcat源码阅读之安全机制

    一.领域(Realm): 1.Principal接口代表角色信息,包含了三个成员:用户名.密码.role列表(以逗号分隔),对应了tomcat-users.xml文件中一行user信息: Generi ...

  9. tomcat源码阅读之集群

    一. 配置: 在tomcat目录下的conf/Server.xml配置文件中增加如下配置: <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点. clas ...

随机推荐

  1. Android开发 ---Button的OnClickListener的三种实现方法

    button的OnClickListener的三种实现方法 onclick事件的定义方法,分为三种,分别为 1.在xml中进行指定方法: 2.在Actitivy中new出一个OnClickListen ...

  2. SharePoint Framework 企业向导(七)

    博客地址:http://blog.csdn.net/FoxDave 企业中的SPFx SharePoint是最成功的企业协作平台之一,能够成功的其中一点是它能够进行扩展并作为一个应用集成平台.SP ...

  3. HTTPS加密原理(转)

    Header HTTP.HTTPS在我们日常开发中是经常会接触到的. 我们也都知道,一般 Android 应用开发,在请求 API 网络接口的时候,很多使用的都是 HTTP 协议:使用浏览器打开网页, ...

  4. python自学第5天,集合,文件读写

    #!/usr/bin/env python #-*- coding:utf-8 -*- # Author:Hunter Yi s={1,1,1,2,3,4,5} print(s) #集合,去重 #关系 ...

  5. python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)

    长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...

  6. python基础4文件操作

    在磁盘上读取文件的 功能都是由操作系统来实现的,不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据( ...

  7. Android全局可调试(ro.debuggable = 1)的一种另类改法

    网上流传比较多的,是重打包boot.img.读aosp的init进程源码,发现通过patch init进程也可以实现相同目的. 首先看一下init进程对ro只读属性的检查: /* property_s ...

  8. JavaBasic_03

    变量 变量定义的格式: 数据类型 变量名 = 初始化值; 可以在一行中定义多个变量(在实际开发中不推荐,推荐一行定义一个变量)数据类型 变量名1=初始化值,变量名,...,变量名n        // ...

  9. 百度地图api开发:根据坐标获得地理描述地址

    // 创建地理编码实例              var myGeo = new BMap.Geocoder();              // 根据坐标得到地址描述            myGe ...

  10. jQuery 中json字符串与对象互转

    json字符串转json对象:jQuery.parseJSON(jsonStr); json对象转json字符串:JSON.stringify(jsonObj);