Tomcat NIO(1)

Easter79
• 阅读 741

点击蓝色字免费订阅,****每天收到这样的好信息

前言:最近有不少粉丝关注本公众号。并且我已经****成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧。大家想买什么书扫描下方的二维码加群。最后,非常感谢大家的关注。

Tomcat NIO(1)

Tomcat NIO(1)

上一篇文章里我们主要介绍了 tomcat NIO 实现的相关架构类,在这里我们主要介绍数据处理类,即实现读写封装的 Request 和 Response 。

在 tomcat NIO 的实现里,会有一系列处理数据读写的类。并且 tomcat 也实现了servlet 标准,是 servlet 容器。所以会把处理数据读写的类封装成标准的HttpServletRequest 和HttpServletResponse 实现,从而完成从原始 socket 连接请求到 servlet API 的调用。对于请求 Request 相关的类,展示如下图:

Tomcat NIO(1)

  • HttpServletRequest 类,代表标准 servlet API 中对于 Request 的具体的定义,其实现类为org.apache.catalina.connector.Request 。

  • HttpServletResponse ,是HttpServletRequest的实例,代表标准 servlet API 中对于 Response 的具体的定义,其中具体的实现类为org.apache.catalina.connector.Response 。

  • Connector 类,属于 HttpServletRequest 类的实例,是对上一篇文章中介绍的顶层框架类 Connector 引用。

  • CoyoteRequest ,属于HttpServletRequest 类的实例,同时也是属于InputBuffer 类和 Http11InputBuffer 类的实例,是 tomcat 对连接请求的封装,同时里面也包含 http method ,uri ,querystring ,host ,port 等 items 的封装。

  • CoyoteInputStream,是 HttpServletRequest 类的实例,是 tomcat 对于输入流的包装。

  • InputBuffer 类,属于 HttpServletRequest 类的实例,也属于 CoyoteInputStream 类的实例,用来完成请求数据的读取。其中包含 Bytebuffer 和 CharBuffer 作为字节和字符读取缓冲区,默认大小为1028*8 bit ,即8KB。

  • CoyoteResponse 类,属于 CoyoteRequest 类的实例,是 tomcat 对于对连接响应的封装。

  • Http11InputBuffer 类,主要用于完成请求数据的读取,其中包含 Bytebuffer 作为字节读取缓冲区,包含 SocketInputBuffer 辅助类用于完成到 Bytebuffer 字节缓冲区的读操作。

  • NioSocketWrapper 类,是 Http11InputBuffer 类的实例,封装了原始的 scoket ,提供封装的 socket 读写操作。

  • NioSelectorPool 类,属于 NioSocketWrapper 类的实例,当数据需要多次读写的时候,监测注册在原始 scoket 上的读写事件是否发生。

  • CountDownLatch 类,这里有 readLatch 实例和 writeLatch 两个实例,而这两个均是属于 NioSocketWrapper 类的实例。用于当数据不可读,或者不可写的时候对 tomcat io 线程的阻塞,即如果数据不可读写,tomcat io 线程会分别在 readLatch 实例和 writeLatch 实例上等待。

  • Poller 类,是属于 NioSocketWrapper 类的实例,主要监测 epoll 模型里注册原始 scoket 上的读写事件是否发生。里面包含事件队列SynchronizedQueue ,java NIO 事件轮询对象 selector,同时还包含了并发事件计数器 weakupCounter。

  • NioChannel 类,是属于 NioSocketWrapper 类的实例,对原始 java NIO 对象 ScoketChannel 的封装,同时它的内部也引用了其所从属的NioSocketWrapper 类的实例。

  • SocketBufferHandler 类,属于 NioChannel 类的实例,主要是用于进行封装原始 java NIO ScoketChannel 对象的读写 buffer 。其内部有 DirectBuffer 类型的读缓冲与写缓存,这里的 DirectBuffer 是堆外内存,而不是 jvm 内存,从而提高了读写效率。

对于请求 Reponse 相关的类,展示如下图:

Tomcat NIO(1)

  • HttpServletReponse 类,代表标准 servlet API中对于Reponse 的定义,其具体实现类为 org.apache.catalina.connector.Reponse。

  • HttpServletRequest,是HttpServletReponse的实例,代表标准 servlet API 中对于 Request 的具体的定义,其中的具体的实现类为org.apache.catalina.connector.Request 。

  • CoyoteOutputStream,是 HttpServletReponse 类的实例,是 tomcat 对于输出流的包装。

  • OutputBuffer 类,是属于 CoyoteOutputStream 类的实例,也属于 HttpServletReponse 类的实例,用来完成响应数据的写操作。其中包含Bytebuffer 和 CharBuffer 作为字节和字符写操作缓冲区,默认大小为1024*8 bit,即8KB。

  • CoyoteResponse 类,即是属于 CoyoteRequest 类的实例,也属于 OutputBuffer 类的实例,是 tomcat 对于对连接响应的封装。

  • Http11OutputBuffer 类,主要用于完成响应数据的写操作,其中包含 Bytebuffer 作为 header 字节写缓冲区,包含 SocketOutputBuffer 辅助类完写操作。

  • NioSocketWrapper,属于Http11OutputBuffer类的实例,封装了原始的 scoket ,提供封装的 socket 读写操作。

Tomcat NIO(1)

打油诗

我不在乎我的作品文章是被现在的人读还是由子孙后代来读。既然上帝花了六千年来等一位观察者,我可以花上一个世纪来等待读者。

Tomcat NIO(1) 

往期推荐

[

spring 状态机

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483872%26idx%3D1%26sn%3Dc3ef5ff34d2b42c6db3ffa53864619e0%26chksm%3Da735e5ec90426cfa50f5c7ba04e0037dbec6524cbc29df6ce1796b8bef0e051815b5de06ba5a%26scene%3D21%23wechat_redirect)

[

spring 状态机 (二)

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483884%26idx%3D1%26sn%3D5502f146a186f39f3538224cf98449cf%26chksm%3Da735e5e090426cf625d4ef7af32bea7c38dc5eafe8e6173a0fc202f7af702ab05c480bcc16e6%26scene%3D21%23wechat_redirect)

[

mybatis用到的设计模式

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483956%26idx%3D1%26sn%3D42874ea6cb0fe4beeeef19c35727f7dd%26chksm%3Da735e63890426f2e62f073621932b3adde068a73ac71c545016cf81774661035f0a2aa331f56%26scene%3D21%23wechat_redirect)

[

jvm高级面试题(必须看)

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247484034%26idx%3D1%26sn%3D5337b37727b44703481f3ee38e0bf7e8%26chksm%3Da735e68e90426f98d758cb6c1d31b690149aa03a1c0053f90e96756854eb34c922c5b502a0d9%26scene%3D21%23wechat_redirect)

[

MySQL索引实现原理分析

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483895%26idx%3D1%26sn%3D6864cce29843fc9b15c0a5ba6d2ec533%26chksm%3Da735e5fb90426ced9778ba94b91601518b9a2cba6df9c0afed23b568365a69a588069ccb1731%26scene%3D21%23wechat_redirect)

[

Spring中的用到的设计模式

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483785%26idx%3D1%26sn%3D56f9191937fe8221fe9c580324ac3963%26chksm%3Da735e58590426c937ba5e8fe851405e58a0902c08bdc22bca3365e6b3e68c958eaf77fb3ef9a%26scene%3D21%23wechat_redirect)

[

SpringBoot 自动装配原理解析(一)

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247484544%26idx%3D1%26sn%3Ddc349403a73f4ec69ed509e1f8dbbe35%26chksm%3Da735e08c9042699a84404134bb140ce766a98c4391a3325252ca915a9fdf16468e645a94bc96%26scene%3D21%23wechat_redirect)

[

java 8 lambda表达式中的异常处理

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483948%26idx%3D1%26sn%3Dcdc2e5b94529beb1a8db4bf7b6338beb%26chksm%3Da735e62090426f36c2529dbb815a9607860974d1db8813a919a63beb018bc3c8a8faec80cad9%26scene%3D21%23wechat_redirect)

[

spring @Async异步方法使用及原理说明

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483922%26idx%3D1%26sn%3Da80c25f6ee1be58612c4f86c185f5825%26chksm%3Da735e61e90426f08dcb6bbcd6ab04c57e797e48264ab9d6ffc53716bee33fe849b8563096102%26scene%3D21%23wechat_redirect)

[

Spring 和 SpringBoot 之间到底有啥区别?

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483926%26idx%3D1%26sn%3D3a5cd886af0402d9ce39499a245222d4%26chksm%3Da735e61a90426f0caac1910fe0311d9de8f04dbf52757e1448ad4007ce06eb5f6400c5a8df90%26scene%3D21%23wechat_redirect)

[

只需这10步,通过历史控制文件恢复数据库

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247483940%26idx%3D1%26sn%3Dbf4970ef2c9e230da67dd06a23dc8fc9%26chksm%3Da735e62890426f3ebc06e75e5b2f9717166bb86814bb4ace8e66a3683d9927feaa0462f373ef%26scene%3D21%23wechat_redirect)

[

让bug无处藏身,Java 线上问题排查思路、常用工具

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMjM5OTg4NDEzMQ%3D%3D%26mid%3D2247484060%26idx%3D1%26sn%3Df0ea843a3c879ecae30f1078398c03cc%26chksm%3Da735e69090426f866c1fd66afa4c83c4ae7d7bc9036f131ff42d204619d084f4df99af5661be%26scene%3D21%23wechat_redirect)

本文分享自微信公众号 - Java小白学心理(gh_9a909fa2fb55)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
B站大会员视频!直接观看!
点击蓝色字!(https://oscimg.oschina.net/oscnet/6e6b3acc4fcdeaa3a275d8edb07037548f5.png)免费订阅,每天收到这样的好信息前言:最近有不少粉丝关注本公众号。并且我已经成功开通了流量主同时会赚一点点广告费
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k