一、概述

第三章介绍的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. 1.3 ASP.NET MVC生命周期

    ASP.NET MVC的执行生命周期主要分为三个阶段,分别是网址路由对比.执行控制器与动作.执行视图并返回结果.从ASP.NET MVC接受HTTP请求到返回HTTP响应的过程如下图所示.

  2. robotframework笔记16

    发布处理具有相同名称的关键字 使用机器人框架要么是关键词 图书馆 关键字 或 用户的关键字 . 前来自 标准 库 或 外部库 ,后者 中创建相同的文件在使用或进口 资源文件 . 许多关键字使用时,是很 ...

  3. robotframework笔记10

    循环和条件 for循环 *** Settings *** Library BuiltIn Library Collections *** Test Cases *** TestCase01 My Ke ...

  4. python 基础学习(字典对象,set对象)

    1.dict 字典对象 a.定义对象 d={'a':14,'b':12}b.通过key获取value d['a'] 方法1.判断key是否存在 if 'a' in d: d['a']方法2:通过用ge ...

  5. 小例子(二)、winform窗体间的关系

    写一个关于winform窗体间的关系 1.登陆,思路:登陆后隐藏登陆窗体,关闭Form2时结束整个应用程序. //登陆窗体 private void button2_Click(object send ...

  6. BZOJ3928 [Cerc2014] Outer space invaders

    第一眼,我勒个去...然后看到n ≤ 300的时候就2333了 首先把时间离散化,则对于一个时间的区间,可以知道中间最大的那个一定要被选出来,然后把区间分成左右两份 于是区间DP就好了,注意用左开右开 ...

  7. JavaWeb chapter 1 http协议

    1.  静态web和动态web的区别: 静态web和动态web最本质的区别是静态web是无法进行数据库操作,而动态web是可以进行数据库操作的.动态web的最大特点就是具有交互性,所谓交互性就是服务器 ...

  8. 利用开源框架Volley来下载文本和图片。

    Android Volley是Android平台上很好用的第三方开源网络通信框架.使用简单,功能强大. 下载连接地址:http://download.csdn.net/detail/zhangphil ...

  9. HDU 2676 Network Wars 01分数规划,最小割 难度:4

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1676 对顶点i,j,起点s=1,终点t=n,可以认为题意要求一组01矩阵use ...

  10. Debug的F5~F8用法

    快捷键(F6)单步执行程序,遇到方法时跳过. 快捷键(F8)执行此断点到最后,进入下一个断点开始之处. 快捷键(F5)单步执行程序,遇到方法时进入. 快捷键(F7)单步执行程序,从当前方法跳出.