一、概述

第三章介绍的connector是一个很好的学习工具,但是我们还可以做的更多。这一章介绍的是Tomcat4默认的connector。

一个Tomcat的connector是一个独立的模块,能够被嵌入到一个servlet容器中。现在已经存在了很多个tomcat连接器,比如说Coyote,mod_jk,mod_jk2,mod_webapp。一个Tomcat的connector需要满足以下的条件:

  1. 实现org.apache.catalina.Connector接口
  2. 创建代表请求的对象并且实现org.apache.catalina.Request接口
  3. 创建代表响应的对象并且实现org.apache.catalina.Response接口

Tomcat4默认的connector和第三张模拟的connector是很相似的,它等待http请求,创建request对象和response对象,然后把request对象和response对象传递到container(容器)中,通过调用org.apache.catalina.Container的invoke方法,这个方法签名如下,

    /**
* Process the specified Request, and generate the corresponding Response,
* according to the design of this particular Container.
*
* @param request Request to be processed
* @param response Response to be produced
*
* @exception IOException if an input/output error occurred while
* processing
* @exception ServletException if a ServletException was thrown
* while processing this request
*/
public void invoke(Request request, Response response)
throws IOException, ServletException;

  在invoke方法内部,容器会加载对象的servlet class文件,调用它的service方法,管理sessions,log出错信息等。

Tomcat4默认的connector也做了一些优化,第一点是使用各种各样的对象池来避免占用资源的对象创建,第二点是在很多地方它使用了字节数组而不是string。

这一章的程序是一个简单的container关联默认的connector,重点在于理解connector,在chapter 5会介绍各种各样的容器。在这一章中,只需要了解如何使用这个简单的container就可以了。

还有一点需要注意的是,默认的connector实现了HTTP 1.1的所有的新的特性,同时也能够处理HTTP 0.9和HTTP 1.0的请求。首先我们会介绍HTTP1.1的新特性,然后介绍org.apache.catalina.Connector接口以及如何创建request和reponse对象。在这一章中,我们能够发现很多在第三章中出现的类,比如HttpConnector,HttpProcessor等,当然它们的功能更加高级一些。

二、HTTP 1.1新特性

1、持久连接(Persistent Connection)

在HTTP1.1之前,不论什么时候一个浏览器连接到server,当server发送完成资源后会立即断开连接。但是,一个page可能包含其他的资源,比如说图片,applets等。所以,当请求一个页面时,浏览器会同时请求这个页面引用的资源。如果一个页面和它引用的资源是通过不同的connection下载到本地,这个处理会很慢。这就是为什么HTTP1.1引进持久化连接的原因。有了持久化连接,当传送完成一个页面时,server不会立即断开连接,它会等待web client来请求这个页面所关联的其他资源。这样,一个页面和它所关联的资源就是通过一个相同的connection进行下载。这样web server、client、网络都会节省很多处理和时间,因为考虑到建立和断开http 连接都是很费时的操作。

HTTP1.1默认建立持久连接。当然,浏览器可以发送如下的请求头来显示地指出使用持久连接:

connection: keep-alive

2、chunked编码

建立了持久连接的结果是,server可以发送多个资源的字节流,并且client可以发送多个请求,都使用的是同样的一个connection。所以,对于每个reqeust或者response,发送方必须发送content length请求头,只有这样,接收方才能知道如何解析收到的字节。但是,经常的一种情况是,发送发不知道要发送多少长度的字节流,举例来说,一个servlet容器能够在只有一部分字节准备到位时发送响应而不必等到所有的字节都到位。这就意味着,必须有一种方法在不能提前知道content-length请求头的请求下,告诉接收方如何解析收到的字节流。

实际上,如果不需要发送多个请求或者响应,server或者client不必知道它需要发送多个数据。在HTTP1.0时,server可以不用理会content-length响应头,一直往connection中写入数据。当它结束的时候,它会简单地关闭连接。在这种情况下,client就会一直从连接中读取数据,直到读取到-1,说明已经读取到文件的末尾了。

HTTP1.1引进了一个特殊的header称为transfer-encoding,来指示字节流是以块(chunks)的方式来发送的。对于每个块,在发送块的数据之前,会首先发送块的长度(以十六进制表示),长度和数据之间以CR/LF(回车换行)间隔。一个transaction(发送一个完整的数据或者文件)用一个0长度的chunk来标示。假设你想用2个chunk来发送以下的38个字节,第一个chunk的长度是29,第二个是9,如下所示。

数据:

I'm as helpless as a kitten up a tree.

发送的协议:

1D\r\n
I'm as helpless as a kitten u
\r\n
p a tree.
\r\n

其中,1D(十六进制)=29(十进制),说明第一个块包含了29个字节。0\r\n指示了发送已经完成。

3、100(Continue)状态的使用

支持HTTP1.1的客户端可能会发送一个这样的请求头(Expect: 100-continue),并且等待server的确认(acknowledgement)。这经常会在客户端准备发送一个很长的请求body但是不确定server是不是会接受的情况下发生。如果仅仅发送了一个很长的request body,只是为了确定server不会接受该客户端的请求,那么只会是一种浪费。

如果收到Expect: 100-continue请求头,并且server愿意或者可以处理该客户端的请求,服务器端就会响应以下的header,前面加上连个CRLF(回车换行)。如下。

CRLF
CRLF
HTTP/1.1 100 Continue

响应之后,服务器会接着读取输入流。

三、Connector接口

四、HttpConnector类

五、HttpProcessor类

六、Request对象

七、Response对象

八、解析请求

九、简单的Container

十、总结

Chapter 4: Tomcat Default Connector的更多相关文章

  1. Tomcat 核心组件 Connector

    Connector是Tomcat的连接器,其主要任务是负责处理浏览器发送过来的请求,并创建一个Request和Response的对象用于和浏览器交换数据,然后产生一个线程用于处理请求,Connecto ...

  2. 内嵌Tomcat的Connector对象的静态代码块

    在排查问题的过程中发现Connector对象有一个静态代码块: static { replacements.put("acceptCount", "backlog&quo ...

  3. 关于 tomcat nio connector, servlet 3.0 async, spring mvc async 的关系

    tomcat 的 org.apache.coyote.http11.Http11NioProtocol Connector 是一个使用 Java NIO 实现的异步 accept 请求的 connec ...

  4. Tomcat 7 Connector 精读(1)

    这个类图是本人截取的最重要的类的方法和属性. 其中ProtocalHandler是协议处理器,tomcat支持的协议以下方法可以看到.不同协议实现了不同的ProtocalHandler类. publi ...

  5. [转]Loadrunner Error code 10053 & Tomcat 连接器(connector)优化

    LoadRunner提示错误:Error : socket0 - Software caused connection abort. Error code : 10053. 在今天的测试过程中发现,s ...

  6. Tomcat HTTP connector和AJP connector

    Tomcat服务器通过Connector连接器组件与客户程序建立连接,“连接器”表示接收请求并返回响应的端点.即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户. ...

  7. Tomcat 7 Connector 精读(2) CoyoteAdapter

    这个适配器类只讲2个方法,构造方法中我们看到一个适配器对象有自己关联的连接器类. 其中Service的重要任务就是讲客户端端请求交给容器. public void service(org.apache ...

  8. Tomcat 7 Connector 精读(2) 协议处理器 Http11Protocol(待续)

    . Http11Protocol是阻塞式IO的实现,上图的几个方法是它的生命周期相关的方法.

  9. Tomcat connector元素常用配置(最大连接数等)

    在tomcat的server.xml中有类似: <Connector port=" minSpareTHreads=" URIEncoding="gbk" ...

随机推荐

  1. 20145218 《Java程序设计》第04次实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.22 实验名称:Android开发基础 一.实验内容 1.基于Android ...

  2. jmeter笔记2

    使用jmeter它来完成最常用的三种类型服务器,即 Web 服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项. 讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测 ...

  3. 关于mvc3.0RadioButtonFor的使用

    以前本人没有使用过mvc,近期的话公司要求使用mvc进行开发项目,我不得不学习,我在这里分享下Html.RadioButtonFor的使用,例如 @Html.RadioButtonFor(d => ...

  4. Qt之QThread(深入理解)

    简述 为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程.对于耗时操作如果不使用线程,UI界面将会长时间处于停滞状态,这种情况是用户非常不愿意看到的,我们可以用线程来解决这个问题. 前面,已 ...

  5. windows下修改mysql用户名和密码

    1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysqld-nt --skip-grant-tables回车.如果没有出现提示信息,那就对了. 4.再开一个 ...

  6. AngularJS开发经验(转)

    AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也可以觉得是小花招)来让 ...

  7. PHP超级全局变量——Session 变量

    PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. PHP Session 变量 当您运行一个 ...

  8. 抓包工具tshark使用备忘

         抓包命令行工具tshark可以用于自定制,相比GUI工具可以实现一些自动化,譬如把某些关注的数据抓起下来存放到文本中,然后再分析输出.      demo: std::string deco ...

  9. CentOS命令登录MySQL时,报错ERROR 1045 (28000):

    CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解 ...

  10. Future 模式介绍

    假设一个任务执行需要花费一些时间,为了省去不必要的等待时间,可以先获取一个提货单,即future,然后继续处理别的任务,知道货物到达,即任务完成得到结果,此时可以使用提货单提货,即通过future得到 ...