Tomcat原理系列之六:详解socket如何封装成request(上)
@(详解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。
Tomcat原理系列之六:详解socket如何封装成request(上)的更多相关文章
- 【tomcat系列】详解tomcat架构(上篇)
java中,常用的web服务器一般由tomcat,weblogic,jetty,undertwo等,但从用户使用广泛度来说,tomcat用户量相对比较大一些,当然这也基于它开源和免费的特点. 从软件架 ...
- Go语言备忘录:反射的原理与使用详解
目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能 1.预备知识: Go的变量都是静态类 ...
- Tomcat配置(二):tomcat配置文件server.xml详解和部署简介
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Tomcat(二):tomcat配置文件server.xml详解和部署简介
Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务 ...
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- Go语言备忘录(2):反射的原理与使用详解
本文内容是本人对Go语言的反射原理与使用的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处:Go语言备忘录(2):反射的原理与使用详解,多谢! ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- <转>详解DNS的常用记录(上):DNS系列之二
详解DNS的常用记录(上) 在上篇博文中,我们介绍了DNS服务器的体系结构,从中我们了解到如果我们希望注册一个域名,那么必须经过顶级域名服务器或其下级的域名服务器为我们申请的域名进行委派,把解析权委派 ...
- Apache + Tomcat集群配置详解 (1)
一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...
随机推荐
- Spring IoC源码解析之invokeBeanFactoryPostProcessors
一.Bean工厂的后置处理器 Bean工厂的后置处理器:BeanFactoryPostProcessor(触发时机:bean定义注册之后bean实例化之前)和BeanDefinitionRegistr ...
- 消息中间件和JMS介绍(一)
在一个公司创立初期,他可能只有几个应用,系统之间的关联也不是那么大,A系统调用B系统就直接调用B提供的API接口:后来这个公司做大了,他一步步发展有了几十个系统,这时候A系统要调用B系统的接口,但是B ...
- 算法与数据结构基础 - 二叉树(Binary Tree)
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- Streaming+Sparksql使用sql实时分析 rabbitmq+mongodb+hive
SparkConf sparkConf = new SparkConf()//此处使用一个链接切记使用一个链接否则汇报有多个sparkcontext错误 .setAppName("Spark ...
- ES 27 - Elasticsearch脚本的使用实践
目录 1 关于脚本 2 脚本使用的最佳实践 2.1 创建脚本并存储 2.2 脚本的缓存 2.3 Script Field - 脚本字段 本文以 ES 6.6.0 版本为例进行演示. 1 关于脚本 ES ...
- 使用sc 命令写脚本 添加和删除服务 简单应用
添加服务 @echo.服务启动...... @echo off @sc create 服务名 binPath= "%~dp0\服务路径" @sc config 服务名 start= ...
- Go-json解码到结构体-踩坑
package main import ( "encoding/json" "fmt" ) type User struct { Name string `js ...
- 二.安全NA之ASA基础
一.ASA常用命令 show run interface #查看接口配置 show ip address #查看IP地址 show conn #查看防火墙状态信息,U代表up:I,代表进流量:O,代表 ...
- Nginx + fastcgi + php 的原理与关系
CGI:Common Gateway Interface 公共网关接口,web服务器和脚本语言通信的一个标准.接口.协议[协议] FastCGI:CGI协议的升级版[协议] PHP-CGI: 实现了C ...
- HTML5实时语音通话聊天,MP3压缩传输3KB每秒
目录 一.把玩方法 二.技术特性 (1)数据传输 (2)音频采集和编码 (3)音频实时接收和播放 三.应用场景 自从Recorder H5 GitHub开源库优化后,对边录边转码成小语音片段文件实时上 ...