`
specialbrian
  • 浏览: 60935 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[解读Tomcat6源码]Tomcat处理底层socket请求的过程

阅读更多

任务

找到如何截获httpsocket请求,然后才能干预tomcat处理http请求。

编译jsp文件的跟踪:

网站访问日志阀AccessLogValve

可以看到两个过程的公共之处。那就是前四个

 

是跟Socket有关的,属于底层协议处理。在第4个调用再往后就是跟requestresponse打交道了。

       因此,我需要研究前4个函数的作用。下面就逐一进行。

(一)  首先是thread.run肯定就是我们的jre运行java程序的共用部分,所以无需细致研究。

(二)  然后就是JIoEndpointWorkerrun方法.

让我们耐心一点,看一看JIoEndpoint的结构吧。

首先这个jioEndpoint文件其中包含:1个内部接口和3个内部类,剩下的就是本身的属性和方法。其中的serverSocket成员让我们想到了《网络编程详解》中的讲解。

可以看出1个内部接口和3个内部类都是为了声明内部成员变量的类型而进行定义的。

接着切入正题吧,看来是Thread中的
    public void run() {

       if (target != null) {

           target.run();

       }

}

调用了jioEndpoint.java中的worker类型对象的run()方法。

        public void run() {

 

            //直到收到关闭信号,否则一直处理请求

            while (running) {

 

                // 等到指派来的下一个socket对象

                Socket socket = await();

//await函数是worker的内部方法,作用是Await a newly assigned Socket from our Connector

                if (socket == null)

                    continue;

 

                // 处理这个socket发出的请求,

//setSocketOptionJIoEndpoint的方法,作用是为这个socket设置一些timeout, linger

//handler.process其中handlerJIoEndpoint的一个成员变量,实际上就是结果socket处理的接力棒,通过它来处理这个socket对象

                if (!setSocketOptions(socket) || !handler.process(socket)) {红色部分就是下一部分要讨论的内容

                    // Close socket

                    try {

                        socket.close();

                    } catch (IOException e) {

                    }

                }

 

                // Finish up this request

                socket = null;

                recycleWorkerThread(this);

 

            }

 

        }

(三)  这个handler好像在初始化的时候被设置成了Http11ConnectionHandler,这样我们就到达了Http11Protocol文件的Http11ConnectionHandler内部类的public boolean process(Socket socket)方法,这个方法实现是这样的:

public boolean process(Socket socket) {

            Http11Processor processor = null;

            try {

                processor = localProcessor.get();

                if (processor == null) {

                    processor =

                        new Http11Processor(protocol.maxHttpHeaderSize, protocol.endpoint);

                    processor.setAdapter(protocol.adapter);

                   

                    processor.setServer(protocol.server);

                    localProcessor.set(processor);

                    if (protocol.getDomain() != null) {

                        synchronized (this) {

                            try {

                                RequestInfo rp = processor.getRequest().getRequestProcessor();

                                rp.setGlobalProcessor(global);

                                ObjectName rpName = new ObjectName

                                (protocol.getDomain() + ":type=RequestProcessor,worker="

                                        + protocol.getName() + ",name=HttpRequest" + count++);

                                Registry.getRegistry(null, null).registerComponent(rp, rpName, null);

                            } catch (Exception e) {

                                log.warn("Error registering request");

                            }

                        }

                    }

                }

 

                if (processor instanceof ActionHook) {

                    ((ActionHook) processor).action(ActionCode.ACTION_START, null);

                }

 

                if (protocol.secure && (protocol.sslImplementation != null)) {

                    processor.setSSLSupport

                        (protocol.sslImplementation.getSSLSupport(socket));

                } else {

                    processor.setSSLSupport(null);

                }

               

                processor.process(socket);

                return false;

 

            } catch(java.net.SocketException e) {

                // SocketExceptions are normal

                Http11Protocol.log.debug

分享到:
评论

相关推荐

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

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

    tomcat源码解析

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

    Tomcat 8.0 源码

    - **线程模型**:Tomcat采用多线程模型处理请求,每个连接请求都会分配到一个工作线程来处理。这种模型能够有效地利用多核CPU资源,提高并发性能。 - **配置文件解析**:Tomcat使用XML配置文件来设置服务器行为,如...

    「Tomcat源码剖析」.pdf

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

    tomcat源码

    《深入剖析Tomcat源码:揭示Web服务器内部机制》 Tomcat,作为一款广泛应用的开源Java Servlet容器,其源码的解析对于理解Web服务器的工作原理、优化应用性能以及进行定制化开发具有重大意义。本文将从核心组件、...

    解析Tomcat处理请求的类Connector<三>

    开发者可以通过阅读源码了解Tomcat如何处理请求,如何调度线程,以及如何优化内存和网络资源的使用。 至于“工具”标签,`Connector`类的配置和管理通常在Tomcat的`server.xml`配置文件中进行。这里可以设置端口号...

    tomcat源码分析图谱

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

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

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

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

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

    tomcat 变声源码

    C++通常用于编写高性能、底层的系统级程序,而将它与Tomcat结合,可能是为了创建一个混合式的解决方案,即在C++中实现复杂的音频处理算法,然后通过Tomcat来提供网络服务,使得这个变声功能可以通过网络接口被其他...

    Tomcat7、Chrome下web socket的一个例子

    标题中的“Tomcat7、Chrome下web socket的一个例子”揭示了我们要探讨的核心技术点,即在Tomcat 7服务器上使用Web Socket与Google Chrome浏览器进行实时双向通信的应用示例。Web Socket是HTML5引入的一种新的通信...

    基于Tomcat6的CAS SSO配置

    基于Tomcat6的CAS SSO配置涉及的主要知识点包括SSO(Single Sign-On,单点登录)、CAS(Central Authentication Service,中心认证服务)、SSL(Secure Socket Layer,安全套接层)以及Tomcat服务器的配置。...

    tomcat 中运行php 环境的jar包

    - 重启Tomcat,现在Tomcat已经具备了处理PHP请求的能力。 这样的集成方式让开发者可以利用Tomcat的高性能特性,同时在需要的地方引入PHP的灵活性和丰富生态。不过需要注意的是,这种方式可能不如直接使用专门的PHP...

    apache-tomcat-8.5.9-src

    1. 阅读源码:了解Tomcat如何处理请求、管理Servlet实例以及加载Web应用。 2. 编译与构建:通过Maven或者Ant工具,可以编译源码并生成可运行的Tomcat。 3. 调试与扩展:利用IDE如Eclipse或IntelliJ IDEA进行源码级...

    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 +Apache实现负载均衡

    通过以上步骤,我们可以构建一个简单的Windows环境下的Apache和Tomcat负载均衡系统,它能够根据配置自动将请求分发到不同的Tomcat实例,提高系统处理能力,并提供一定的容错性。在实际应用中,还需要考虑监控、故障...

    struts源码,最新的源码

    邮件开发网(ExtMail Dev Networks)的文档“Tomcat Server处理一个http请求的过程”可能是对上述流程的一个详细解释,可能包含了更多关于Tomcat内部工作原理和Struts集成的信息。如果你在处理邮件系统相关的开发,...

    tomcat connectors

    6. 使用持续集成工具(如Jenkins、Travis CI等)自动化测试过程。 7. 分析测试报告,找出性能瓶颈和潜在的bug。 总之,"tomcat connectors"是Tomcat服务器的核心组件,Python和Selenium则是测试Web应用程序的强大...

    使用MyEclipse调试远程tomcat项目

    在IT行业中,开发Java Web应用时,MyEclipse是一款常用且功能强大的集成开发环境(IDE),它提供了丰富的工具集来支持开发、测试和部署过程。本文将深入探讨如何使用MyEclipse进行远程调试Tomcat服务器上的项目,...

Global site tag (gtag.js) - Google Analytics