Tomcat原理系列之六:详解socket如何封装成request(上)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: Tomcat原理系列之六:详解socket如何封装成request(上)

@TOC

看源码虽然不能马上提升你的编码水平。但能让你更好的理解编程。

因为我们tomcat多是以NIO形式处理请求,所以本系列讲的都是NIO类型请求的处理相关组件。

在讲解过程之前,把相关概念理解是非常关键的


参与者


tomcat中Connector是负责处理请求的。


1.协议处理ProtocolHandler

Connector使用ProtocolHandler处理器来处理请求。不同的ProtocolHandler代表不同连接类型。

ProtocolHandler处理器可以用看作是协议处理统筹者,通过管理其他工作组件实现对请求的处理。ProtocolHandler 包含了三个非常重要的组件:

  • Endpoint: 负责接受,处理socket网络连接
  • Processor: 负责将从Endpoint接受的socket连接根据协议类型封装成request
  • Adapter:负责将封装好的Request交给Container进行处理。


2.Socket的封装

  • NioChannel: SocketChannel的基础包装类,在EndPonit中使用。
  • SocketWrapper:socket的包装类,用于携带(NioChannel)socket进行传递。

区别:NioChannel是基本包装,SocketWrapper是对NioChannel的进一步包装.



3.多种buffer

  • 套接字输入流InputStream:属于jdk中的io包。充当操作系统从底层读取socket字节的通道
  • SokcetBuffer即ByteBuffer。位于java.nio包下,NIO层面的buffer。Tomcat在创建此类Buffer时默认的大小时8*1024,也就是8K
  • InputBuffer接口(内部缓冲区):coyote包下, 用于Tomcat内部的Request缓冲区。套接字输入缓冲装置,即提供一种缓冲的模式从socket中读取字节流。通过查看源码我感觉他也是一个工具接口,更加偏向于一个工具.列如:实现类Http11InputBuffer,具有提供解析请求头与转义功能.
  • InputBuffer类:connector包下。用于Servlet规范的Request内部的缓冲区
  • MessageBytes消息字节:tomcat在接受socket传入的字节之后并不会马上进行编码转换,而是保持byte[]数组,在用到的地方再进行转换。MessageBytes正是byte[]的抽象
  • 子节块操作工具ByteChunk: 首先他是一个工具,一个操作缓冲的工具。其次有两个内部接口:ByteInputChannel和ByteOutputChannel读写数据。还有一个Chartset对象方便编码。所以他是一个提供了编码功能,操作缓存的工具。


4.两对request,response

tomcat中存在两组request,respone

  • org.apache.coyote包下的: 属于Tomcat内部对请求的一个定义,final类型的类不对开发者开放。主要功能就是封装socket解析http协议的header内容。
  • org.apache.catalina.connector包下的: 属于对servlet规范的实现。也是我们开发常见的request对象。

所以tomcat中会有一个涉及request与request的转换过程,这些过程都放到后续讲,此篇只讲解组件概念。

Tomcat内部使用Apache Coyote库来处理网络I/O的。Connector包多是用于Servlet规范。


5.多种处理器

tomcat内部很多都命名为处理器。这里讲讲提几个讲讲区别:

  • ProtocolHandler处理器:统筹或者管理级别的处理器。Connector把请求处理的工作交给ProtocolHandler去处理。剩下的是ProtocolHandler统筹。由此看出他是一个管理界别的处理器
  • ConnectionHandler:连接处理器,.内部维护Processor的map用于重用SocketProcessor.    把创建Processor的工作交给ProtocolHandler去做.
    SocketProcessor处理器调用ConnectionHandler.process()将socket请求内容传入Processor.process()进行处理.
    由此可见ConnectionHandler具有承上启下的作用.
  • SocketBufferHandler:socketBuffer处理器。包含两个SocketBuffer,用于socket读写的缓冲。
  • SocketProcessor: socket处理器,针对socket的处理器。本身是一个worker,将socket内容交给Processor处理
  • (Processor)Http11Processor: HTTP协议1.1是目前使用最多的一个HTTP协议版本。从此处理器的名字我们也可以看出,他就是针对此协议的处理。此处理器是将socket转为请求的主要组件,他从socket将HTTP协议的内容解析出来,不过在tomcat中他只负责了对http请求行,请求头的解析;请求体的解析延迟到了servlet中去解析了。 Http11Processor 由ConnectionHandler 创建,tomcat 对关键的类都实现了重用,以减少频繁创建和销毁的开销,会从recycledProcessors 里pop出来


总结


掌握了这些相关组件的概念后。下章讲解socket如何变成request。


相关文章
|
2月前
|
设计模式 网络协议 Java
Tomcat 高并发之道原理拆解与性能调优
Tomcat 高并发之道原理拆解与性能调优
63 0
|
2月前
|
设计模式 Java 应用服务中间件
Tomcat 架构原理解析到设计借鉴
Tomcat 架构原理解析到设计借鉴
172 0
|
2月前
|
设计模式 Java 应用服务中间件
Tomcat 架构原理解析到架构设计借鉴
Tomcat 架构原理解析到架构设计借鉴
116 0
|
2月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
62 0
|
13天前
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
|
8天前
|
网络协议 程序员 数据安全/隐私保护
socket编程原理
socket编程原理
133 59
|
11天前
|
Java 数据安全/隐私保护
深入剖析:Java Socket编程原理及客户端-服务器通信机制
【6月更文挑战第21天】Java Socket编程用于构建网络通信,如在线聊天室。服务器通过`ServerSocket`监听,接收客户端`Socket`连接请求。客户端使用`Socket`连接服务器,双方通过`PrintWriter`和`BufferedReader`交换数据。案例展示了服务器如何处理每个新连接并广播消息,以及客户端如何发送和接收消息。此基础为理解更复杂的网络应用奠定了基础。
|
2月前
|
网络协议 网络安全 程序员
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
|
2月前
|
安全 Java 应用服务中间件
【小白误闯】这可能是对 Tomcat 工作原理解释最详细的文章
脑子一闪而过,当年 V 哥在面试 Java 开发时,被问到让你写一个 Tomcat 服务器,你有什么想法?尼码,面试官摆明是在压工资了,你得逞了,我回答不上来,当时也没研究过 Tomcat 的源码,饮恨被拒。今天想想看,当时尴尬的表情,蛮逗的嘞。 今天V 哥有空把这个问题整理出来,干脆写成文章吧,放到资料库里,也分享给大家。Tomcat 是一个流行的 Java Servlet 和 JSP 容器,用于运行 Java Web 应用程序。它的核心组件主要包括:
|
2月前
|
算法 Java 应用服务中间件
Tomcat性能优化及JVM内存工作原理
Tomcat性能优化及JVM内存工作原理