日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别

發(fā)布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

看了下netty 源代碼,?終于明白了

Channel.write()?和?ChannelHandlerContext.write()?的區(qū)別了

網(wǎng)上說的都不是很清楚

首先注明我的netty版本

```

io.netty

netty-all

4.0.36.Final

```

ChannelPipeline處理ChannelHandler的順序:

pipeline中的handler 處理的請求分為兩類: 讀 和 寫

對于讀請求 : 從handler鏈表的 head ?到 ?tail ? ? 挨個的處理, 跳過 ChannelOutboundHandler

對于寫請求 : 從handler鏈表的?tail ? ? ?到 ?head?挨個的處理, 跳過 ChannelInboundHandler

1 調(diào)用?Channel.write(), 會直接調(diào)用ChannelPipeline.write()

public?ChannelFuture?write(Object?msg)?{

return?pipeline.write(msg);

}

public?ChannelFuture?write(Object?msg,?ChannelPromise?promise)?{

return?pipeline.write(msg,?promise);

}

public?ChannelFuture?writeAndFlush(Object?msg)?{

return?pipeline.writeAndFlush(msg);

}

public?ChannelFuture?writeAndFlush(Object?msg,?ChannelPromise?promise)?{

return?pipeline.writeAndFlush(msg,?promise);

}

而ChannelPipeline.write() 直接調(diào)用 tail指向的 最后一個handler的 write[java]?view plain?copy

public?ChannelFuture?write(Object?msg)?{

return?tail.write(msg);

}

@Override

public?ChannelFuture?write(Object?msg,?ChannelPromise?promise)?{

return?tail.write(msg,?promise);

}

可以看到 調(diào)用的是ctx.prev獲取前一個, 所以寫從tail到head

2 調(diào)用ChannelHandlerContext.write()

首先通過findContextOutbound找到當(dāng)前ChannelHandlerContext的上一個OutboundContext

再調(diào)用它執(zhí)行具體的寫入邏輯

private?void?write(Object?msg,?boolean?flush,?ChannelPromise?promise)?{

AbstractChannelHandlerContext?next?=?findContextOutbound();

EventExecutor?executor?=?next.executor();

if?(executor.inEventLoop())?{

next.invokeWrite(msg,?promise);

if?(flush)?{

next.invokeFlush();

}

}?else?{

AbstractWriteTask?task;

if?(flush)?{

task?=?WriteAndFlushTask.newInstance(next,?msg,?promise);

}??else?{

task?=?WriteTask.newInstance(next,?msg,?promise);

}

safeExecute(executor,?task,?promise,?msg);

}

}

private?AbstractChannelHandlerContext?findContextOutbound()?{

AbstractChannelHandlerContext?ctx?=?this;

do?{

ctx?=?ctx.prev;

}?while?(!ctx.outbound);

return?ctx;

}

結(jié)論:

Channel.write() ?: ? ? ? ? ? ? ? ? ? ? ? ?從 tail 到 head 調(diào)用每一個outbound 的?ChannelHandlerContext.write

ChannelHandlerContext.write() : 從當(dāng)前的Context, 找到上一個outbound, 從后向前調(diào)用?write

總結(jié)

以上是生活随笔為你收集整理的java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。