`

Tomcat 7源码学习笔记 - 2 (socket接入后的处理)

阅读更多
前一篇文章写到SocketProcessor的run方法,这次继续说明后续的处理流程。

1.在之前的Http11Protocol构造方法中,创建JIoEndpoint对象以后,接着指定了handler,就是Http11ConnectionHandler对象。

public Http11Protocol() {
        endpoint = new JIoEndpoint();
        cHandler = new Http11ConnectionHandler(this);
        ((JIoEndpoint) endpoint).setHandler(cHandler);
        setSoLinger(Constants.DEFAULT_CONNECTION_LINGER);
        setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
        setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY);
}


2.所以SocketProcessor的run方法中,直接调用了handler.process(socket,status)。这个process方法在Http11ConnectionHandler的父类AbstractConnectionHandler中定义。

3.接着,在process方法中回调Http11ConnectionHandler中的createProcessor()方法,createProcessor()方法会创建一个Http11Processor对象并返回。然后process方法中会继续调用Http11Processor对象的process(SocketWrapper<S> socketWrapper)方法。

4.process(SocketWrapper<S> socketWrapper)方法定义在Http11Processor的父类AbstractHttp11Processor中,从这个process方法开始,才正式进入了对request请求的处理。

5.process方法的大致处理如下

a.从socket中获得inputstream和outputstream,分别设置到Http11Processor类中的InternalInputBuffer和InternalOutputBuffer中

InternalInputBuffer类里面的inputStream成员变量保存从socket中获得的inputstream,父类AbstractInputBuffer中有request成员变量Request request

InternalOutputBuffer类里面的outputStream成员变量保存从socket中获得的outputstream,父类AbstractOutputBuffer中有response成员变量Response response



// Setting up the I/O
setSocketWrapper(socketWrapper);
getInputBuffer().init(socketWrapper, endpoint);
getOutputBuffer().init(socketWrapper, endpoint);


b.调用InternalInputBuffer类的parseRequestLine方法,该方法内部从inputStream里面读取http请求头header信息,进行分析后把header中的信息设置到request中,如:
method,requestURI,protocol。

c.调用prepareRequest方法,对该请求的filter进行设置。
在前面的3.中,构造Http11Processor对象的时候,会调用initializeFilters方法向
InternalInputBuffer和InternalOutputBuffer中添加标准的filter

   
/**
     * Initialize standard input and output filters.
     */
    protected void initializeFilters(int maxTrailerSize) {
        // Create and add the identity filters.
        getInputBuffer().addFilter(new IdentityInputFilter());
        getOutputBuffer().addFilter(new IdentityOutputFilter());

        // Create and add the chunked filters.
        getInputBuffer().addFilter(new ChunkedInputFilter(maxTrailerSize));
        getOutputBuffer().addFilter(new ChunkedOutputFilter());

        // Create and add the void filters.
        getInputBuffer().addFilter(new VoidInputFilter());
        getOutputBuffer().addFilter(new VoidOutputFilter());

        // Create and add buffered input filter
        getInputBuffer().addFilter(new BufferedInputFilter());

        // Create and add the chunked filters.
        //getInputBuffer().addFilter(new GzipInputFilter());
        getOutputBuffer().addFilter(new GzipOutputFilter());

        pluggableFilterIndex = getInputBuffer().getFilters().length;
    }


d.prepareRequest方法中调用addInputFilter方法,根据请求header中的transfer-encoding的值来选择要添加的filter。

transfer-encoding:
    identity的时候,不添加filter
    chunked的时候,添加ChunkedInputFilter
    buffered的时候,添加BufferedInputFilter
    void的时候,添加VoidInputFilter

如果header中没有transfer-encoding,那么从header中取content-length,如果content-length >= 0,那么添加IdentityInputFilter。否则,添加VoidInputFilter。

e.调用CoyoteAdapter类中的service(request, response)方法来处理请求。

f.请求处理完以后,调用endRequest()方法结束请求,向客户端返回响应。

getInputBuffer().endRequest();
getOutputBuffer().endRequest();


6.请求处理完以后,当前的请求处理线程结束。2.中的SocketProcessor的run方法结束。

关于e.中的service(request, response)方法的处理细节,下回继续分解。
分享到:
评论

相关推荐

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    《深入理解Tomcat-Redis-Session-Manager:在Tomcat7和Tomcat8中的应用》 在现代Web应用程序开发中,session管理是一个至关重要的环节,它涉及到用户会话的持久化和跨请求的数据共享。传统的session管理方式在高...

    tomcat-redis-session-manager源码

    《深入解析Tomcat-Redis-Session-Manager源码》 在现代Web应用中,服务器端会话管理是一个至关重要的部分,特别是在高并发、分布式环境中。Tomcat作为最流行的Java Servlet容器,提供了丰富的功能来支持这一需求。...

    开发工具 apache-tomcat-8.0.41-windows-x86

    开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-windows-x86开发工具 apache-tomcat-8.0.41-...

    Tomcat7下载(apache-tomcat-7.0.85)

    Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)Tomcat7下载(apache-tomcat-7.0.85)

    Tomcat 源代码调试笔记 - 看不见的 Shell1

    【Tomcat 源代码调试笔记 - 看不见的 Shell】这篇笔记主要探讨了如何在Tomcat运行时动态插入过滤器,以及遇到的问题和解决方法。Tomcat作为一个流行的Java应用服务器,它允许开发者通过Servlet规范中的`...

    apache-tomcat-9.0.45-windows-x64

    apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-tomcat-9.0.45-windows-x64apache-...

    tomcat-redis-session-manager支持tomcat7

    因tomcat7使用redis共享session,其他的包存在问题,自己编译后处理通过。 该包是在https://github.com/jcoleman/tomcat-redis-session-manager 将源码编译后的包。

    tomcat-connectors-1.2.48-src

    《深入理解Tomcat连接器:剖析tomcat-connectors-1.2.48-src源码》 Tomcat作为一款广泛使用的开源Java应用服务器,其在处理Web应用方面扮演着核心角色。而Tomcat的连接器(Connector)是其与外部世界交互的关键组件...

    tomcat-redis-session-manager-1.2-tomcat-6&7

    标题 "tomcat-redis-session-manager-1.2-tomcat-6&7" 指的是一个用于在Tomcat服务器中集成Redis作为session管理器的组件。这个组件使得Web应用程序可以利用Redis分布式缓存系统来存储和管理用户的会话数据,从而...

    Tomcat8亲测可用 tomcat-redis-session-manager的jar包

    描述中提到的“修改了tomcat-redis-session-manager源码进行的编译生成的jar包”,意味着这个jar包不是官方发布的原版,而是经过开发者对源代码进行了一些定制化的修改后重新编译得到的。这样的修改可能包括修复已知...

    tomcat-redis-session-manager for tomcat8.5

    压缩文件包括tomcat-redis-session-manager-master-2.0.0.jar、jedis-2.7.3.jar、commons-pool2-2.3.jar三个jar包使用方法请参照https://github.com/jcoleman/tomcat-redis-session-manager。apache-tomcat-8.5.33....

    tomcat-redis-session-manager-1.2-tomcat-6.jar

    用于配置 tomcat-redis-session-manager

    tomcat-connectors-1.2.32-src.tar.gz

    解压“tomcat-connectors-1.2.32-src”后,我们可以看到源码目录结构,包括头文件、C源文件、配置脚本等。主要的核心文件有: 1. modules/jk/*.c:这是JK模块的源代码,负责处理与Tomcat的连接和通信。 2. modules/...

    tomcat共享session tomcat-redis-session-manager-2.0.0.jar包下载

    tomcat-redis-session-manager-2.0.0.jar包,不用自己打包了,tomcat共享session到redis中,解决分布式应用的状态问题。

    apache-tomcat-8.5.32-windows-x64.zip

    这个"apache-tomcat-8.5.32-windows-x64.zip"压缩包是针对Windows 64位系统的Tomcat 8.5.32版本的安装包。这个版本在Tomcat 8系列中是一个稳定版本,它提供了许多特性,优化了性能,并修复了一些已知的安全问题。 ...

    云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-基于ssm的云的学习笔记系统-ssm-java代码

    云的学习笔记-云的学习笔记系统-云的学习笔记系统源码-云的学习笔记管理系统-云的学习笔记管理系统java代码-云的学习笔记系统设计与实现-基于ssm的云的学习笔记系统-基于Web的云的学习笔记系统设计与实现-云的学习...

    apache-tomcat-8.0.47-windows-x64.zip 【Tomcat服务器,Tomcat8 windows 64位版】

    解压这个"apache-tomcat-8.0.47"文件后,您会发现以下目录结构: - **bin**:包含启动和停止Tomcat的脚本以及一些实用工具。 - **conf**:存放Tomcat的配置文件,如server.xml、web.xml等。 - **lib**:存储Tomcat...

    官方原版apache-tomcat-10.0.0-M4-windows-x64.zip

    解压后的"apache-tomcat-10.0.0-M4"目录结构通常包括以下关键部分: 1. **bin**:包含启动和停止Tomcat的脚本,如`catalina.bat`和`startup.bat`,以及其他管理工具。 2. **conf**:存放服务器配置文件,如`server....

    Tomcat源码apache-tomcat-8.5.47-src.zip

    `apache-tomcat-8.5.47-src.zip`这个压缩包包含了Tomcat 8.5.47版本的完整源代码,这对于想要研究Tomcat工作原理、优化性能或者进行自定义扩展的开发者非常有价值。 在开始学习Tomcat源码之前,首先需要了解一些...

    tomcat-native-1.2.14-win32-64-bin

    总之,"tomcat-native-1.2.14-win32-64-bin"是一个用于解决Tomcat兼容性问题和提升性能的库,特别是对于处理SSL/TLS连接。正确集成和使用这个库可以显著改善Tomcat在Windows环境下的运行效率。对于需要处理大量SSL...

Global site tag (gtag.js) - Google Analytics