一、概述

第三章介绍的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. ing

    #include <stdio.h> int main(){ int a,b; while(scanf("%d%d",&a,&b)!=EOF & ...

  2. Java GC系列(2):Java垃圾回收是如何工作的?

    本文由 ImportNew - 伍翀 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 本教程是为了理解基本的Java垃圾回收以及它是如何 ...

  3. Unity Invoke 方法

    Invoke() 方法是 Unity3D 的一种委托机制 如: Invoke("a", 5);   它的意思是:5 秒之后调用 a() 方法: 使用 Invoke() 方法需要注意 ...

  4. Response返回JSON数据到前台页面

    转自博文:<Response JSON数据返回>http://blog.csdn.net/anialy/article/details/8665471 简述: 在servlet填充Resp ...

  5. iOS:控制器间的数据传递

    在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递.顺传递是指数据的传递方向和控制器的跳转方向相同(如图1):逆传递是指数据的传递方向和控制器的跳转方向相反(如图2).这里分别介绍这 ...

  6. 转载Javascript继承两种形式详解

    一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来分 ...

  7. c++ boost 汉字和模式串混用的例子

    *=============================================================== * Copyright (C) All rights reserved ...

  8. BZOJ1570 [JSOI2008]Blue Mary的旅行

    建分层图,每一层表示一天的情况 从S向第0层的1号点连边,每层的n向T连INF的边 枚举天数,每多一天就多建一层然后跑最大流,如果当前流量大于人数则输出答案 由于路径长度不会超过n,因此tot个人走这 ...

  9. asp.net core StaticFiles中间件修改wwwroot

    new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentD ...

  10. [转]Visual Studio 2010 单元测试目录

    Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...