Netty实战 IM即时通讯系统(十一)pipeline与channelHandler
生活随笔
收集整理的這篇文章主要介紹了
Netty实战 IM即时通讯系统(十一)pipeline与channelHandler
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Netty實(shí)戰(zhàn) IM即時(shí)通訊系統(tǒng)(十一)pipeline與channelHandler
零、 目錄
- Netty 簡(jiǎn)介
- Netty 環(huán)境配置
- 服務(wù)端啟動(dòng)流程
- 客戶(hù)端啟動(dòng)流程
- 實(shí)戰(zhàn): 客戶(hù)端和服務(wù)端雙向通信
- 數(shù)據(jù)傳輸載體ByteBuf介紹
- 客戶(hù)端與服務(wù)端通信協(xié)議編解碼
- 實(shí)現(xiàn)客戶(hù)端登錄
- 實(shí)現(xiàn)客戶(hù)端與服務(wù)端收發(fā)消息
- pipeline與channelHandler
- 構(gòu)建客戶(hù)端與服務(wù)端pipeline
- 拆包粘包理論與解決方案
- channelHandler的生命周期
- 使用channelHandler的熱插拔實(shí)現(xiàn)客戶(hù)端身份校驗(yàn)
- 客戶(hù)端互聊原理與實(shí)現(xiàn)
- 群聊的發(fā)起與通知
- 群聊的成員管理(加入與退出,獲取成員列表)
- 群聊消息的收發(fā)及Netty性能優(yōu)化
- 心跳與空閑檢測(cè)
- 總結(jié)
- 擴(kuò)展
一、 簡(jiǎn)介
二、 pipeline 與channelHandler 的構(gòu)成
三、 ChannelHandler 的分類(lèi)
四、 ChannelInboundHanndler 的事件傳播
關(guān)于ChannelInboundHandler , 我們拿 ChannelRead() 為例子 , 來(lái)體驗(yàn)一下inbound時(shí)間的傳播
我們?cè)诜?wù)端的pipeline 添加三個(gè)ChannelInboundHandler
Test_12_Server.javaserverBootstrap.group(bossGroup, workGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel ch) throws Exception {ch.pipeline().addLast(new Test_11_InboundHandlerA());ch.pipeline().addLast(new Test_11_InboundHandlerB());ch.pipeline().addLast(new Test_11_InboundHandlerC());}});每個(gè)inBoundHandler 繼承自ChannelInboundHandlerAdapter , 然后實(shí)現(xiàn)了 channelRead() 方法
/*** 2019年1月29日* @author outman* 服務(wù)端處理 A*/class Test_11_InboundHandlerA extends ChannelInboundHandlerAdapter{@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buffer = (ByteBuf)msg;System.out.println("Test_11_InboundHandlerA --> " + buffer.toString(Charset.forName("UTF-8")));super.channelRead(ctx, msg);}}/*** 2019年1月29日* @author outman* 服務(wù)端處理 B*/class Test_11_InboundHandlerB extends ChannelInboundHandlerAdapter{@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buffer = (ByteBuf)msg;System.out.println("Test_11_InboundHandlerB --> " + buffer.toString(Charset.forName("UTF-8")));super.channelRead(ctx, msg);}}/*** 2019年1月29日* @author outman* 服務(wù)端處理 C*/class Test_11_InboundHandlerC extends ChannelInboundHandlerAdapter{@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {ByteBuf buffer = (ByteBuf)msg;System.out.println("Test_11_InboundHandlerC --> " + buffer.toString(Charset.forName("UTF-8")));super.channelRead(ctx, msg);}}五、ChannelOutboundHandler 的時(shí)間傳播
關(guān)于ChannelOutboundHandler , 我們拿write()為例子,來(lái)體驗(yàn)一下outbound事件的傳播。
我們繼續(xù)在服務(wù)端的pipeline添加三個(gè)ChannelOutboundHandler
Test_12_Server.javaserverBootstrap.group(bossGroup, workGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() {@Overrideprotected void initChannel(NioSocketChannel ch) throws Exception {// inbound 服務(wù)端讀數(shù)據(jù)邏輯ch.pipeline().addLast(new Test_11_InboundHandlerA());ch.pipeline().addLast(new Test_11_InboundHandlerB());ch.pipeline().addLast(new Test_11_InboundHandlerC());// outbound 服務(wù)端系數(shù)據(jù)邏輯ch.pipeline().addLast(new Test_11_OutboundHandlerA());ch.pipeline().addLast(new Test_11_OutboundHandlerB());ch.pipeline().addLast(new Test_11_OutboundHandlerC());}});每個(gè)outboundHandler都繼承自ChannelOutboundHandlerAdapter , 然后實(shí)現(xiàn)了write()方法
/*** 2019年2月14日* @author outman** 服務(wù)端寫(xiě)數(shù)據(jù)邏輯 A*/class Test_12_OutboundHandlerA extends ChannelOutboundHandlerAdapter {@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {System.out.println("Test_12_OutboundHandlerA --> " + msg);super.write(ctx, msg, promise);}}/*** 2019年2月14日* @author outman** 服務(wù)端寫(xiě)數(shù)據(jù)邏輯 B*/class Test_12_OutboundHandlerB extends ChannelOutboundHandlerAdapter {@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {System.out.println("Test_12_OutboundHandlerB --> " + msg);super.write(ctx, msg, promise);}}/*** 2019年2月14日* @author outman** 服務(wù)端寫(xiě)數(shù)據(jù)邏輯 C*/class Test_12_OutboundHandlerC extends ChannelOutboundHandlerAdapter {@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {System.out.println("Test_12_OutboundHandlerC --> " + msg);super.write(ctx, msg, promise);}}可以看到outboundHandler的執(zhí)行順序與我們添加的順序相反 , 最后,我們?cè)趤?lái)看一下pipeline的結(jié)構(gòu)和執(zhí)行順序。
六 、 總結(jié)
七 、 思考
總結(jié)
以上是生活随笔為你收集整理的Netty实战 IM即时通讯系统(十一)pipeline与channelHandler的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Netty实战 IM即时通讯系统(十)实
- 下一篇: Netty实战 IM即时通讯系统(十二)