日韩性视频-久久久蜜桃-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源码的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 苍井空浴缸大战猛男120分钟 | 女人被男人操 | 国产精品美女www爽爽爽 | 97av在线视频| 久久久久久97 | 奇米影视盒 | 亚洲精品成人无码 | 性一交一乱一透一a级 | 亚洲第四页 | 日韩美女三级 | 日本不卡123 | 伊人精品在线观看 | 日本在线成人 | 中国大陆一级毛片 | 国产精品人人爽 | 中文字幕第3页 | 国产精品久久久久久久久久久久久久久久久久 | 深夜国产福利 | 亚洲午夜免费视频 | 亚洲视频在线免费观看 | 欧美丝袜一区二区三区 | 香港三日本8a三级少妇三级99 | 成人aaaaa| 日韩久久久久久久 | 中国精品久久久 | 国产第一精品视频 | 免费黄色在线 | 中文字幕人妻精品一区 | www.偷拍.com | 久色视频 | 日韩国产一区二区 | 91极品美女 | 国产一区二区在线电影 | 亚洲欧美视频在线播放 | 成人片在线视频 | 老熟妇仑乱一区二区av | 樱井莉亚av | 国产精品久久久久久亚洲影视 | 亚洲性少妇 | 性久久久久 | 欧美亚洲专区 | 国产午夜视频在线 | 怡春院国产 | av网址网站| 高h放荡受浪受bl | 奇米影视狠狠干 | 日韩免费观看一区二区 | 加勒比hezyo黑人专区 | 熟女人妇 成熟妇女系列视频 | 风流少妇一区二区三区91 | 蜜臀人妻四季av一区二区不卡 | 蜜桃久久久久久久 | 日韩一区二区高清视频 | 久久aⅴ国产欧美74aaa | 中文字幕亚洲综合 | 无码成人精品区一级毛片 | 欧美亚洲高清 | 咪咪色影院 | 美女xx网站 | 在线看网站 | 午夜av福利 | 国产日韩欧美视频在线观看 | 中文字幕精品亚洲 | 二男一女一级一片 | 国产精选久久久 | 日韩 欧美 中文 | 国内精品偷拍视频 | 综合久久亚洲 | 国产精品二区一区二区aⅴ污介绍 | 我我色综合| 日韩视频免费观看高清完整版 | 网站免费视频www | 疯狂做受xxxx国产 | 国产又粗又爽视频 | 成人亚洲一区 | 日韩在线第一 | 亚州一二区 | 在线观看日韩中文字幕 | 成人动态视频 | 手机免费看av片 | 狠狠干干 | 亚洲成熟少妇视频在线观看 | 国模私拍一区二区三区 | 久久综合综合 | 亚洲一区欧美一区 | 日韩中文字| 日韩在线播放中文字幕 | 国产,日韩,欧美 | 亚洲色图27p | 香港一级淫片免费放 | 亚洲av成人精品午夜一区二区 | 手机av在线 | 爱视频福利网 | 中文久久字幕 | 国产私人影院 | 欧美日韩国产亚洲沙发 | a级性生活视频 | 日韩欧美高清在线观看 | 亚洲精品久久久蜜桃网尤妮丝 |