Tomcat 源代码分析之Socket通讯

此系列文章皆为Tomcat 7.0代码代码分析。

1.    Socket通讯:

Tomcat对于 Socket的处理方式主要分为以下几种:

1. BIO方式:采用Java阻塞Socket通讯的方式处理连接。

2. NIO方式:之前采用BIO(阻塞方式),现在由于在Java1.4之后引入NIO,提供了NIO的实现。

3.APR方式:为了和本地机器更好的集成,有更高的性能,例如一些高级的系统IO功能(sendfile, epoll and OpenSSL),本地操作的处理(shared memory, NT pipes and Unix sockets以及OS Level的功能(random number generation, system status, etc),Tomcat使用JNI调用处理Socket链接。

4.AJP和ARP结合的方式。

5.AJP方式:通过AJP协议进行通讯 : AJP主要用于Apache的HTTP服务器和Servlet Web容器之间通讯,它是Packet_Oriented的,换句话说,它发送给浏览器(其他Web Server)的数据是Packet(s),得到Servlet 容器的响应也是Packet(s),这里有特殊情况,如果Servlet 容器发送的数据是二进制的,则直接发送给浏览器。此外,AJP还可以重用和Servlet容器之间的Socket连接(Socket Connection),降低创建开销。 具体请看:

2.    模型介绍

Connector由ProtocolHandler和一个连接端口组成,ProtocolHandler使用以上介绍的各种方式处理Socket。

根据配置选取不同的ProtocolHandler实现类的代码如下:

/**       * Set the Coyote protocol which will be used by the connector.       *       * @param protocol The Coyote protocol name       */       public void setProtocol(String protocol) {              if (AprLifecycleListener.isAprAvailable()) {               if ("HTTP/1.1".equals(protocol)) {                   setProtocolHandlerClassName                       ("org.apache.coyote.http11.Http11AprProtocol");               } else if ("AJP/1.3".equals(protocol)) {                   setProtocolHandlerClassName                       ("org.apache.coyote.ajp.AjpAprProtocol");               } else if (protocol != null) {                   setProtocolHandlerClassName(protocol);               } else {                   setProtocolHandlerClassName                       ("org.apache.coyote.http11.Http11AprProtocol");               }           } else {               if ("HTTP/1.1".equals(protocol)) {                   setProtocolHandlerClassName                       ("org.apache.coyote.http11.Http11Protocol");               } else if ("AJP/1.3".equals(protocol)) {                   setProtocolHandlerClassName                       ("org.apache.coyote.ajp.AjpProtocol");               } else if (protocol != null) {                   setProtocolHandlerClassName(protocol);               }           }          }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pfpww.html