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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

netty tcp服务端主动断开客户端_「Netty核心技术」6-ChannelPipeline源码

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netty tcp服务端主动断开客户端_「Netty核心技术」6-ChannelPipeline源码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ChannelPipeline是Channelhandler的容器,它負責ChannelHandler的管理和事件攔截與調度。

土話:

ChannelPipeline就是用來管理Channelhandler有增刪功能。還有一些事件的攔截,交給ChannelHandler處理。

關于閱讀源碼的步驟,請參考這份源碼閱讀步驟你值得擁有

ChannelPipeline的功能

管理ChannelHandler

  • addXXX:增加ChannelHandler
  • get:獲得ChannelHandler
  • remove:移除ChannelHandler
  • replace:代替ChannelHander

攔截ChannelHandler的事件,這里比較重要

從圖中看

  • 從Socket.read()經過ChannelHandler1,ChannelHandler2....ChannelHandlerN開始稱為inbound事件。
  • 從ChannelHandlerContext開始經過ChannelHandlerN,ChannelHandlerN-1,...一直到ChannelHandler1,Socket.write()稱為outbound事件。

inbound事件對應ChannelInboundInvoker類

inbound事件通常由I/O線程觸發,例如TCP鏈路建立事件,鏈路關閉事件,讀事件,異常通知事件等。

public interface ChannelInboundInvoker { //Channel注冊事件 //Channel注冊成功后會執行該方法,對應的地方AbstractChannel.register0方法 ChannelInboundInvoker fireChannelRegistered(); //取消注冊事件 //取消注冊后調用,對應的地方AbstractChannel.deregister ChannelInboundInvoker fireChannelUnregistered(); //TCP鏈路建立成功,Channel激活事件,客戶端與服務端建立連接 //客戶端發起請求后 //服務端會從ServerBootstrapAcceptor會收到channelRead,childGroup注冊一個child //對應的地方是AbstractChannel.register0 //客戶端則再連接成功后對應的地方AbstractNioChannel.fulfillConnectPromise ChannelInboundInvoker fireChannelActive(); //客戶端與服務端斷開連接的時候調用 ChannelInboundInvoker fireChannelInactive(); //異常的通知事件 ChannelInboundInvoker fireExceptionCaught(Throwable cause); //用戶自定義事件 //就是我們定義ChannelHandler的時候可以調用我們自定義的fireUserEventTriggered ChannelInboundInvoker fireUserEventTriggered(Object event); //讀數據事件 //對應調用的地方是NioUnsafe.read ChannelInboundInvoker fireChannelRead(Object msg); //讀操作完成 //對應調用的地方是NioUnsafe.read讀完后調用 ChannelInboundInvoker fireChannelReadComplete(); //channel的可寫狀態變化通知事件 ChannelInboundInvoker fireChannelWritabilityChanged();}

上面的每個方法都很重要,我們要自定義ChannelHandler的時候必須要知道怎么調用這些方法。

outbound事件對應ChannelOutboundInvoker類

outbound通常是由用戶主動發起的網絡I/O操作,例如用戶發起的連接操作,綁定操作,消息發送等操作。

public interface ChannelOutboundInvoker { //bind本地地址事件 ChannelFuture bind(SocketAddress localAddress); //連接服務端事件 ChannelFuture connect(SocketAddress remoteAddress); ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress); //斷開連接事件 ChannelFuture disconnect(); //關閉當前channel事件 ChannelFuture close(); //取消注冊事件 ChannelFuture deregister(); ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise); ChannelFuture connect(SocketAddress remoteAddress, ChannelPromise promise); ChannelFuture connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise); ChannelFuture disconnect(ChannelPromise promise); ChannelFuture close(ChannelPromise promise); ChannelFuture deregister(ChannelPromise promise); //讀事件 ChannelOutboundInvoker read(); //發送事件 ChannelFuture write(Object msg); ChannelFuture write(Object msg, ChannelPromise promise); //刷新事件 ChannelOutboundInvoker flush(); //寫和刷新事件 ChannelFuture writeAndFlush(Object msg, ChannelPromise promise); ChannelFuture writeAndFlush(Object msg); ChannelPromise newPromise(); ChannelProgressivePromise newProgressivePromise(); ChannelFuture newSucceededFuture(); ChannelFuture newFailedFuture(Throwable cause); ChannelPromise voidPromise();}

我們擴展事件一般是在inbound事件。

核心類DefaultChannelPipeline

DefaultChannelPipeline是Netty用來管理ChannelHandler的核心類

DefaultChannelPipeline

protected DefaultChannelPipeline(Channel channel) { this.channel = ObjectUtil.checkNotNull(channel, "channel"); succeededFuture = new SucceededChannelFuture(channel, null); voidPromise = new VoidChannelPromise(channel, true); tail = new TailContext(this); head = new HeadContext(this); head.next = tail; tail.prev = head;}

分析DefaultChannelPipeline關鍵成員變量

  • head:是現實HeadContext繼承了AbstractChannelHandlerContext,AbstractChannelHandlerContext就是Channelhandler的上下文。DefaultChannelPipeline包含了很多ChannelHander,指向第一個事件
  • tail:對應TailContext,指向DefaultChannelPipeline的末尾事件。
  • channel:注冊的channel,例如服務端對應的就是NioSockerServerChannel,客戶端對應的就是NioSocketChannel。
  • pendingHandlerCallbackHead:當執行完了handler的增加刪除操作后調用,用來做回調處理。
  • registered:AbstractChannel是否注冊,一旦注冊了就不會再改變了
  • 分析AbstractChannelHandlerContext類

  • AttributeMap,DefaultAttributeMap一些參數的定義Map
  • ResourceLeakHint:就是用來定義做一些提示,打印一些自定義參數用的。
  • ChannelHandlerContext:它代表了 ChannelHandler 和ChannelPipeline 之間的關聯。接口ChannelHandlerContext 主要是對通過同一個 ChannelPipeline 關聯的 ChannelHandler 之間的交互進行管理。
  • ChannelHandlerContext就是結合了ChannelInboundInvoker和ChannelOutboundInvoker,然后多了一些Handler的處理,比如說名稱,獲得ChannelHandler等等。

    閱讀源碼知識點:

    剛開始設計框架的時候,開發者也不會說設計的很完善,都是后面設計之后,慢慢抽象出來的。例如你要問我為什么要設計一個ChannelHandlerContext出來,我只能跟你說,有一些抽象方法ChannelInboundInvoker和ChannelOutboundInvoker沒有必須要有一個新的接口聚合它兩,并且要提供一些方法。

    再來看AbstractChannelHandlerContext成員變量

  • AbstractChannelHandlerContext next:頭結點
  • AbstractChannelHandlerContext prev:尾結點
  • inBound:是否為inbound事件
  • outbound:是否為outbound事件
  • AbstractChannelHandlerContext的結構是一個雙鏈表

    AbstractChannelHandlerContext結構

    再來分析DefaultChannelHandlerContext類

    final class DefaultChannelHandlerContext extends AbstractChannelHandlerContext { private final ChannelHandler handler; DefaultChannelHandlerContext( DefaultChannelPipeline pipeline, EventExecutor executor, String name, ChannelHandler handler) { super(pipeline, executor, name, isInbound(handler), isOutbound(handler)); if (handler == null) { throw new NullPointerException("handler"); } this.handler = handler; }

    主要就是封裝handler成一個Context

    分析HeadContext類

    final class HeadContext extends AbstractChannelHandlerContext implements ChannelOutboundHandler, ChannelInboundHandler

    HeadContext實現了ChannelOutboundHandler,ChannelInboundHandler。上面說過outbound事件是一些網絡I/O操作,例如用戶發起的連接操作,綁定操作,消息發送等操作。intbound:CP鏈路建立事件,鏈路關閉事件,讀事件,異常通知事件等。

    分析TailContext類

    final class TailContext extends AbstractChannelHandlerContext implements ChannelInboundHandler

    TailContext只實現了ChannelInboundHandler,但是它的一些inbound事件都不能使用,因為HeadContext已經使用了。

    @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { onUnhandledInboundChannelActive(); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { onUnhandledInboundChannelInactive(); } @Override public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception { onUnhandledChannelWritabilityChanged(); }

    onUnhandledXXXX:就表示do noting。

    小結一下,本篇講解了

  • ChannelPipeline的功能,是用來管理Channelhandler,和攔截事件請求。
  • 分析了ChannelPipeline的inbound事件通常由I/O線程觸發,例如TCP鏈路建立事件,鏈路關閉事件,讀事件,異常通知事件等。outbound通常是由用戶主動發起的網絡I/O操作,例如用戶發起的連接操作,綁定操作,消息發送等操作。
  • 核心類DefaultChannelPipeline的功能
  • 核心類DefaultChannelPipeline的成員變量AbstractChannelHandlerContext是一個雙向鏈表,它用來保存Channelhandler
  • 核心類DefaultChannelPipeline的成員變量,HeadContext指向AbstractChannelHandlerContext的頭部,TailContext指向AbstractChannelHandlerContext尾部。
  • 下篇講解ChannelPipeline源碼解析二,主要分析DefaultChannelPipeline中的核心方法。

    建議閱讀

    「Netty核心技術」5-客戶端啟動

    「Netty核心技術」4-服務端啟動

    「Netty核心技術」3-AbstractBootStrap

    「Netty核心技術」2-HelloWorld

    「Netty核心技術」1-序言

    總結

    以上是生活随笔為你收集整理的netty tcp服务端主动断开客户端_「Netty核心技术」6-ChannelPipeline源码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 一级毛片儿| 一区二区黄色 | 伊人久久一区 | 久久久久久久久艹 | a级在线免费观看 | 北条麻纪在线观看aⅴ | 亚洲成色网 | 日本xxxx高潮少妇 | 国产一区二区三区精品在线观看 | 激情av中文字幕 | 欧美综合激情网 | 白白色在线播放 | 蜜桃精品一区二区 | 免费裸体视频网站 | 黄色无毒网站 | 91网站在线观看视频 | 国产又粗又猛视频免费 | 日韩成人在线看 | 国产国产乱老熟女视频网站97 | 国产视频成人 | 91理论片午午伦夜理片久久 | 16一17女人毛片 | 高清国产一区二区 | 精品久久久久久亚洲综合网站 | 亚洲黄色激情 | 午夜资源 | 国产一国产二国产三 | 中文字幕一区二区三区四区欧美 | 欧美三级视频 | 欧美性色19p | 日本888xxxx| 久久国产成人精品国产成人亚洲 | 天天想你免费观看完整版高清电影 | 九九热这里都是精品 | 免费黄色片子 | 4438x亚洲| 精品三区视频 | 国产极品视频在线观看 | 国产精品视频一区二区三区在3 | 51福利视频 | 麻豆精品国产传媒av | 色悠久久综合 | 欧美成人午夜精品免费 | 日本动漫艳母 | 国产主播在线播放 | 69精品在线观看 | 欧美少妇b | 久久久久成人精品免费播放动漫 | 亚洲视频黄 | 精品一区二区久久久久久久网站 | 色狠狠操 | 好吊妞一区二区三区 | 男女爽爽爽| 成人在线视频一区二区三区 | 91久久精品一区二区别 | 亚洲精品第一页 | 黄视频网站在线观看 | 日本黄在线 | 91在线观看欧美日韩 | 91漂亮少妇露脸在线播放 | 亚洲第一在线视频 | 丝袜诱惑一区 | 91网站在线免费观看 | 特及毛片 | 色多多导航 | 亚洲精品无码久久久久 | 涩涩免费网站 | 久久久久亚洲精品中文字幕 | 午夜小视频免费 | 欧美日韩精品二区 | 亚洲人无码成www久久 | 免费观看av | 亚洲天堂2018av | 日韩毛片在线观看 | 欧美日韩在线视频一区二区三区 | 九一天堂 | 波多野结衣亚洲一区二区 | 男女涩涩网站 | 越南a级片 | av中文在线播放 | 免费看色 | 无码人妻精品一区二区三区99日韩 | 在线电影一区二区三区 | 亚洲福利一区 | 西西人体44www大胆无码 | 婷婷久久五月 | 最近中文字幕无免费 | 91尤物视频在线观看 | 亚洲区视频在线观看 | 人妻无码久久一区二区三区免费 | 男人的天堂手机在线 | 国产精品一二区在线观看 | 午夜性刺激免费视频 | 六月色婷婷 | 亚州av影院 | 国产成人福利 | 制服丝袜av在线播放 | 欧美一区二区三区在线观看视频 | 男人懂的网站 |