`

Tomcat 源代码分析之Socket通讯

阅读更多

 

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. AJPARP结合的方式。
  5. AJP方式:通过AJP协议进行通讯 : AJP主要用于ApacheHTTP服务器和Servlet Web容器之间通讯,它是Packet_Oriented的,换句话说,它发送给浏览器(其他Web Server)的数据是Packet(s),得到Servlet 容器的响应也是Packet(s),这里有特殊情况,如果Servlet 容器发送的数据是二进制的,则直接发送给浏览器。此外,AJP还可以重用和Servlet容器之间的Socket连接(Socket Connection),降低创建开销。 具体请看:http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html

2.    模型介绍

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

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

 

Java代码   收藏代码
  1. /** 
  2.      * Set the Coyote protocol which will be used by the connector. 
  3.      * 
  4.      * @param protocol The Coyote protocol name 
  5.      */  
  6.     public void setProtocol(String protocol) {  
  7.   
  8.         if (AprLifecycleListener.isAprAvailable()) {  
  9.             if ("HTTP/1.1".equals(protocol)) {  
  10.                 setProtocolHandlerClassName  
  11.                     ("org.apache.coyote.http11.Http11AprProtocol");  
  12.             } else if ("AJP/1.3".equals(protocol)) {  
  13.                 setProtocolHandlerClassName  
  14.                     ("org.apache.coyote.ajp.AjpAprProtocol");  
  15.             } else if (protocol != null) {  
  16.                 setProtocolHandlerClassName(protocol);  
  17.             } else {  
  18.                 setProtocolHandlerClassName  
  19.                     ("org.apache.coyote.http11.Http11AprProtocol");  
  20.             }  
  21.         } else {  
  22.             if ("HTTP/1.1".equals(protocol)) {  
  23.                 setProtocolHandlerClassName  
  24.                     ("org.apache.coyote.http11.Http11Protocol");  
  25.             } else if ("AJP/1.3".equals(protocol)) {  
  26.                 setProtocolHandlerClassName  
  27.                     ("org.apache.coyote.ajp.AjpProtocol");  
  28.             } else if (protocol != null) {  
  29.                 setProtocolHandlerClassName(protocol);  
  30.             }  
  31.         }  
  32.   
  33.     }  

 

 

其相应的配置例子如下:

 

Java代码   收藏代码
  1. <Connector port="8080" protocol="HTTP/1.1"  
  2.                connectionTimeout="20000"  
  3.                redirectPort="8443" />  

 

 

Connector调用ProtocolHandler对象处理Socket,主要代码在该Connector类的startInternal()里,如下

 

Java代码   收藏代码
  1. /** 
  2.      * Begin processing requests via this Connector. 
  3.      * 
  4.      * @exception LifecycleException if a fatal startup error occurs 
  5.      */  
  6.     @Override  
  7.     protected void startInternal() throws LifecycleException {  
  8.   
  9.         setState(LifecycleState.STARTING);  
  10.   
  11.         try {  
  12.             protocolHandler.start();  
  13.         } catch (Exception e) {  
  14.             String errPrefix = "";  
  15.             if(this.service != null) {  
  16.                 errPrefix += "service.getName(): \"" + this.service.getName() + "\"; ";  
  17.             }  
  18.   
  19.             throw new LifecycleException  
  20.                 (errPrefix + " " + sm.getString  
  21.                  ("coyoteConnector.protocolHandlerStartFailed"), e);  
  22.         }  
  23.   
  24.         mapperListener.start();  
  25. }  

 

ProtocolHandler对象会启动一个相应的AbstractEndpoint对象来创建ServerSocket,监听服务相应的端口,并启动线程池处理消息。

ProtocolHandler对象启动AbstractEndpoint对象的代码在org.apache.coyote.AbstractProtocolHandler类里,如下:

 

Java代码   收藏代码
  1. @Override  
  2.     public void start() throws Exception {  
  3.         if (getLog().isInfoEnabled())  
  4.             getLog().info(sm.getString("abstractProtocolHandler.start",  
  5.                     getName()));  
  6.         try {  
  7.             endpoint.start();  
  8.         } catch (Exception ex) {  
  9.             getLog().error(sm.getString("abstractProtocolHandler.startError",  
  10.                     getName()), ex);  
  11.             throw ex;  
  12.         }  
  13. }  

 

各种不同的ProtocolHandler对应的AbstractEndpoint如下:

ProtocolHandler

AbstractEndpoint

AjpAprProtocol

AprEndpoint

AjpProtocol

JIoEndpoint

Http11AprProtocol

AprEndpoint

Http11NioProtocol

NioEndpoint

Http11Protocol

JIoEndpoint

不同协议处理方式请看这个类的实现:AprEndpointJIoEndpointNioEndpoint

JIoEndpoint采用BIO方式处理,NioEndpoint采用NIO的方式处理,AprEndpoint调用大量的Poll的大量native方法处理Socket。具体不再一一介绍。

我们最后为这三个组件画出一个简单的模型,如下:

3.    TomcatServerServiceConnector之间的关系:

一个Server包含多个Service,而一个Service由多个Connector组成。

一个Server对应一个Servlet容器的实例,而一个Service可以由多个Connector组成,但是这些Connector必须是一个Engine的,Engine代表一台实际的物理或者虚拟机器,因为Tomcat可以实现集群的,配置片段示例如下:

 

Java代码   收藏代码
  1. <Service name="Catalina">  
  2.         <Connector port="8080" protocol="HTTP/1.1"  
  3.                connectionTimeout="20000"  
  4.                redirectPort="8443" />  
  5.         <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  
  6.        <Engine  …>  
  7.                ….  
  8.        </Engine>  
  9. </Service>  

 

今天就讲到这里了,后续继续把自己已看的东西整理出来。

分享到:
评论

相关推荐

    tomcat 分配请求之——socket获取请求

    标题“Tomcat分配请求之——Socket获取请求”主要涉及的是Tomcat服务器在处理HTTP请求时的核心机制。在Web服务器中,Tomcat是一个广泛使用的开源应用服务器,它负责解析并响应来自客户端(如浏览器)的HTTP请求。这...

    「Tomcat源码剖析」.pdf

    Tomcat源码剖析 : 整体架构 层层分析 源码解析 架构分析 (Http服务器功能:Socket通信(TCP/IP)、解析Http报文 Servlet容器功能:有很多Servlet(自带系统级Servlet+自定义Servlet),Servlet处理具体的业务逻辑...

    tomcat源码解析

    ### tomcat源码解析 #### 简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web应用的开发与部署环境中。它不仅支持Servlet API,还支持JSP规范,使得开发者能够轻松地构建动态网页。本文旨在深入...

    Tomcat源代码学习研究

    《深入剖析Tomcat源代码:探索底层实现原理》 Tomcat作为开源的Java Servlet容器,是许多Web开发者和系统管理员的首选。它以其轻量级、高效和稳定性著称,而深入理解其源代码,有助于我们更好地优化应用性能,解决...

    tomcat源码分析图谱

    tomcat的基础脚本分析 tomcat的源码启动分析 tomcat的web应用启动分析 tomcat的socket分析 tomcat的cocket与容器对接时序分析

    flex+java+tomcat实现socket通信及安全策略

    /********** 本例子是本人参考网上的例子,重新整理和修改的例子,非常简单和具有针对性****/ 1.背景:Flex Socket通信及安全策略,使用flex实现客户端,java实现...需要在java服务端开通843权限策略,具体看例子源码

    tomcat源码

    Tomcat,作为一款广泛应用的开源Java Servlet容器,其源码的解析对于理解Web服务器的工作原理、优化应用性能以及进行定制化开发具有重大意义。本文将从核心组件、工作流程、模块架构等方面,深入探讨Tomcat的源码...

    安卓XMPP聊天通讯Socket相关-XMPP(Android客户端的实现Tomcat版的Androidpn).rar

    【标题】中的“安卓XMPP聊天通讯Socket相关-XMPP(Android客户端的实现Tomcat版的Androidpn).rar”提到了XMPP(Extensible Messaging and Presence Protocol)在Android平台上的实现,以及它与Tomcat服务器的结合。...

    Tomcat 8.0 源码

    Tomcat 8.0是Apache软件基金会的顶级项目之一,是一款开源的、轻量级的Java应用服务器,尤其在处理Servlet和JSP方面表现突出。它是Java EE(现为Jakarta EE)规范的重要组成部分,广泛应用于各种Web应用程序的开发和...

    SocketInputStream.java

    深入剖析tomcat第三章SocketInputStream源码 * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/StringManager.java,v 1.2 2001/07/22 20:25:14 pier Exp $ * $Revision: 1.2...

    从零手写Tomcat【源码】【abl-tomcat-001】【准备步骤,基础Socket通信环境搭建】

    从零手写Tomcat【源码】【abl-tomcat-001】【准备步骤,基础Socket通信环境搭建】 文章地址:https://blog.csdn.net/m0_37969197/article/details/123956989 目录地址:...

    tomcat 变声源码

    "Tomcat 变声源码"指的是基于Tomcat服务器平台的、用于实现声音变换功能的源代码。Tomcat是一个流行的开源Java应用服务器,主要用于部署和运行Servlet和JSP应用。这里提到的“变声”功能可能是指在通信或者音频处理...

    留备tomcat sourcecode

    "留备Tomcat source code"的标题表明了保存Tomcat源代码的重要性,这主要是为了应对未来可能的情况,比如Apache基金会不再提供源代码下载,或者开发者需要对Tomcat进行深度定制或调试。 Tomcat源代码包含了许多关键...

    Tomcat7、Chrome下web socket的一个例子

    在开发Web Socket应用时,除了Tomcat和Chrome之外,我们还可能用到IDE(如IntelliJ IDEA、Eclipse)、版本控制系统(如Git)、调试工具(如Chrome开发者工具)以及性能分析工具等。 在压缩包文件“web-socket”中,...

    基于java Swing 框架使用socket技术开发的即时通讯系统【源码+数据库】

    本项目是一套基于java Swing 框架使用socket技术开发的即时通讯系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 ...

    TOMCAT_6_0_26最新源代码

    《深入解析TOMCAT_6_0_26源代码》 Apache Tomcat,作为一款广泛应用的开源Java Servlet容器,以其高效、轻量级的特性赢得了开发者们的喜爱。特别是TOMCAT_6_0_26版本,它在当时是一个稳定且功能完善的版本,为许多...

    Eclipse远程调试Tomcat

    在远程调试Tomcat时,确保Eclipse中的项目已经包含了要调试的源代码,这样可以查看和分析代码逻辑。如果Tomcat部署的应用程序是WAR或EAR包,可能需要将其解压并将源代码导入到Eclipse项目中,或者设置源代码路径以便...

    11. 计算机网络编程(Socket)思维导图

    - 当Tomcat接收到HTTP请求时,它会解析JSP页面,生成对应的Java源代码,然后编译并执行,最后将结果返回给客户端。 7. **JSP运行流程** - JSP页面在服务器上被Tomcat解析,生成对应的Servlet。 - Servlet执行后...

    基于Tomcat7、Java、Ext、WebSocket的聊天室

    项目中的文件"\WebSocket.rar"可能包含所有与WebSocket相关的源代码和配置文件,而"\no.txt"可能是项目开发者留下的说明或注释。要运行这个聊天室,你需要将"\WebSocket.rar"解压,然后配置Tomcat7服务器,将项目...

Global site tag (gtag.js) - Google Analytics