Tomcat响应数据过程
创始人
2024-09-24 19:33:03
0

        我们在用Tomcat响应数据给客户端的时候,一般会调用如下代码

OutputStreamoutputStream=resp.getOutputStream(); outputStream.write("test".getBytes());

        Tomcat在响应客户端或者接受客户端消息的时候会用到门面模式,所以响应的时候Response的类型其实是ResponseFacade(接收的时候是RequestFacade),得到的socket.getOutputStream()得到的类型是CoyoteOutputStream类型(接受端也是,Coyote是核心类)。CoyoteOutPutStream中有一个属性ob(OutputBuffer),write方法调用的就是ob.writeBytes(),底层代码如下

    private void writeBytes(byte b[], int off, int len) throws IOException {          if (closed) {             return;         }          append(b, off, len);         bytesWritten += len;          if (doFlush) {             //每次把缓冲区的数据发送出去             flushByteBuffer();         }      }

        OutputBuffer中有个属性是bb(ByteChunk类型),里面有一个字节数组buff(8092kb),每次往缓冲区里添加数据的时候,就是往buff中写数据。代码中可以看到必须要满足doFlush的时候才会清空缓冲区,doFlush基本上就是在Servlet代码执行完前开发手动的调用OutputStream.flush()方法就会把它设置成true。这里就需要思考,什么时候会将buff中的数据放到socket中?

        ByteChunk有一个属性out(ByteOutPutChannel),本质上就是一个管道,实现了数据流向到哪里,里面有一个realWriteBytes方法。当我们调用的时候就会把数据往下游(可以先理解为往socket发,实际是往socketbuff中发,第二层缓存)发送。

public void realWriteBytes(ByteBuffer buf) throws IOException {        outputChunk.setBytes(buf,off,cnt);        coyoteResponse.doWrite(buf); }

这里面主要就是通过一个outputChunk来标记这些数据是要传输下去的,真正实现发送功能的就是coyoteResponse.dowrite。

        ByteChunk里面有append方法,来表示往buff中添加数据,当缓冲区大小满了之后,也会触发数据清空操作。还有一种情况就是上述说的,在缓冲区没满的时候,开发手动调用flush方法,也会执行数据清空下发操作。

        当我们调用outputStream.flush()方法的时候

                1.判断是否生成过响应头,有的话就不生了,没有的话说明是第一次发送,那么生成响应头。

                2.因为调用了flush方法,所以会调用ByteChunk的flushBuffer方法,将buff中的数据发出去,然后清空

                3.2中的数据其实是发送给另一个缓存(socketBuffer,但是这个缓存你是可以不用的,通过一些设置),SocketBuffer中也有一个ByteChunk,数据也是存放在这里面的,所以最后做的是将SocketBuffer中的数据发送到socket

        有一个属性useSocketBuffer,默认是false(如果要用必须你将socketBuffer设置大小超过500才会启用,这个可以自己去配置)

        我们最后调用的是coyoteResponse.doWrite方法,这里往下推调用的是outPutBuffer.doWrite方法(执行AbstractOutPutBuffer的逻辑)

                1.doWrite方法会先判断响应头是否已经发送,如果还没有,那么会先构造响应头然后发给socketBuffer

               2.发送完响应头,就会去判断你的数据到底是用Chunk还是ContentLength发送,对应着三个Filter(ContentLength->IdentityFilter,分块响应体->ChunkedFilter,不发送->VoidFilter)

        所以需要确定的是,到底是执行哪个Filter的逻辑,Tomcat的选择逻辑如下:

                Servlet中的所有代码执行完之后,就会调用response.finishResponse()->OutputBuffer.close()。close方法中会去判断响应体是否已经发送过了,如果一直没有发送过,说明缓冲区肯定是没满的,并且玩家没有执行过flush,那么第一缓冲区中的数据就是我们这次要发送的所有数据,所以缓冲区中的数据大小就是我们要的ContentLength大小,如果说在调用close之前已经发送过数据了,那么就会调用ChunkedFIlter的逻辑,比如我们自己调用flush,或者缓冲区满了,就会执行这个逻辑。

                在执行close方法的时候,会先将响应头的数据发送到socketBuffer,然后再将响应体的数据通过对应的OutputFilter发送,最后会调用OutputFilter的end方法,分块发送的时候会循环掉(因为有很多块),IdentityFilter就会一次性全部发送出去。

        上文就是Tomcat响应数据的过程

               

                

相关内容

热门资讯

安卓系统变身软件有哪些,盘点热... 你有没有发现,你的安卓手机最近是不是有点儿“焕然一新”了呢?是不是觉得它突然变得超级酷炫,仿佛拥有了...
安卓系统在欧珀手机,安卓系统下... 你有没有发现,最近欧珀手机在国内外的市场上可是越来越火了?这不,咱们就来聊聊安卓系统在欧珀手机中的应...
小米2原生安卓7系统,性能与体... 你有没有想过,一部手机,除了拍照、玩游戏,还能给你带来怎样的惊喜?今天,就让我带你走进小米2的世界,...
安卓最简单的手机系统,最简单手... 你有没有想过,拥有一部手机,却不用为复杂的系统烦恼?想象只需轻轻一点,就能完成所有操作,那该多美好!...
ros是安卓系统吗,揭秘安卓系... 哦,亲爱的读者,你是否曾好奇过,ROS(Robot Operating System)是不是安卓系统...
安卓系统装饰房子游戏,打造梦幻... 你知道吗?现在手机游戏可是越来越好玩了,尤其是那些可以在安卓系统上装饰房子的游戏,简直让人爱不释手!...
大厂攻略系统和安卓互通,解锁全... 你有没有想过,那些在大厂工作的朋友们,他们是如何轻松应对各种复杂的工作任务的呢?秘密武器之一,就是那...
amigoos是安卓系统吗,安... 你有没有听说过Amigoos这个软件?最近,它在网上可是引起了不小的讨论呢!很多人都在问,Amigo...
安卓如何弄系统配音,安卓系统配... 你有没有想过,你的安卓手机也能变得像电影里的配音演员一样,声音抑扬顿挫,引人入胜?没错,今天就要来教...
谷歌加大控制安卓系统,新策略解... 你知道吗?最近谷歌可是动作频频,对安卓系统进行了大刀阔斧的改革。这可不是小打小闹,而是要彻底改变安卓...
安卓纯净os系统就是苹果系统吗... 你有没有想过,安卓纯净OS系统是不是就像苹果系统那样呢?是不是一提到纯净,就让人联想到那简洁、优雅的...
win系统和安卓哪个好,谁更胜... 说到电脑操作系统,你是不是也跟很多人一样,在Win系统和安卓之间纠结不已?今天,就让我来给你好好分析...
安卓系统后台走流量,如何有效管... 你有没有发现,手机里的安卓系统有时候就像一个偷跑的小偷,悄无声息地在你不知情的情况下消耗着你的流量呢...
安卓系统upapp怎么更新,从... 亲爱的安卓用户们,你是否也遇到了这样的烦恼:每次打开upapp,总是发现它还停留在那个版本,而新版本...
安卓10系统的华为,创新与性能... 你知道吗?最近手机圈里可是热闹非凡呢!安卓10系统的新风潮已经吹到了华为的身上,让这款国产手机品牌焕...
安卓车机系统推介,安卓车机系统... 你有没有发现,现在开车出门,车机系统的重要性简直堪比手机里的操作系统呢!想象你正驾驶着爱车,突然想听...
安卓5.0系统我的世界,探索安... 亲爱的读者,你是否曾在某个午后,坐在电脑前,被《我的世界》那五彩斑斓的世界深深吸引?今天,就让我带你...
给安卓系统制造故障,揭秘幕后黑... 你知道吗?在科技飞速发展的今天,安卓系统已经成为了全球最受欢迎的手机操作系统之一。但是,你知道吗?有...
安卓系统怎么拍漫画,一键拍出精... 你有没有想过,用安卓手机也能轻松拍出漫画风格的图片呢?没错,就是那种色彩鲜艳、线条流畅,看起来就像是...
安卓系统的心酸史,从心酸起步到... 你有没有想过,我们每天离不开的安卓系统,它也有着一段不为人知的心酸史呢?想象一个从无到有,从默默无闻...