当前位置: 移动技术网 > IT编程>开发语言>Java > Tomcat原理系列之六:详解socket如何封装成request(上)

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

2019年09月12日  | 移动技术网IT编程  | 我要评论

门客网,cad图库大全,首发ss52ss

目录

@(详解socket如何封装成request)

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

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

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

参与者

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

协议处理protocolhandler

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

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

  • endpoint: 负责接受,处理socket网络连接

  • processor: 负责将从endpoint接受的socket连接根据协议类型封装成request

  • adapter:负责将封装好的request交给container进行处理。

socket的封装

  • niochannel: socketchannel的基础包装类,在endponit中使用。

  • socketwrapper:socket的包装类,用于携带(niochannel)socket进行传递。

区别:niochannel是基本包装,socketwrapper是对niochannel的进一步包装.

多种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对象方便编码。所以他是一个提供了编码功能,操作缓存的工具。

两对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包多是用于serlvet规范。

多种处理器

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。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网