基于Netty實(shí)現(xiàn)WebSocket的常用處理器及區(qū)別解析
ChannelInboundHandlerAdapter 和 SimpleChannelInboundHandler 都是 Netty 提供的處理器基類。
它們之間的主要區(qū)別:
ChannelInboundHandlerAdapter
ChannelInboundHandlerAdapter 是一個(gè)通用的處理器基類,繼承自 ChannelInboundHandler,用于處理 入站消息(即從客戶端到服務(wù)端的消息)。
它不做任何具體的消息類型限制,因此適用于處理各種類型的入站消息。
你可以重寫 channelRead 方法來(lái)處理不同類型的消息,或者重寫 exceptionCaught 等方法處理異常。
特點(diǎn):
通用:沒有指定消息類型,你可以在 channelRead 方法中處理任何類型的入站消息。
靈活:你需要手動(dòng)判斷消息的類型,進(jìn)行相應(yīng)的處理。
適用場(chǎng)景:適用于處理多種不同類型的消息,或者當(dāng)你希望處理多個(gè)類型的消息時(shí)。
public class WebSocketServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof TextWebSocketFrame) { // 處理 TextWebSocketFrame 消息 String request = ((TextWebSocketFrame) msg).text(); ctx.channel().writeAndFlush(new TextWebSocketFrame("Hello, " + request)); } else { super.channelRead(ctx, msg); // 轉(zhuǎn)發(fā)其他消息 } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } }
SimpleChannelInboundHandler
SimpleChannelInboundHandler 是 ChannelInboundHandlerAdapter 的一個(gè)子類,它專門用于處理某一特定類型的入站消息。你需要在創(chuàng)建 SimpleChannelInboundHandler 時(shí)指定消息類型 T(如 TextWebSocketFrame、ByteBuf 等)。
它在處理完每個(gè)消息后會(huì)自動(dòng)釋放該消息,因此避免了手動(dòng)管理消息的生命周期(比如調(diào)用 ReferenceCountUtil.release)。
如果消息類型不匹配,它會(huì)拋出異常,這使得它更適合處理單一類型的消息,簡(jiǎn)化了類型檢查。
特點(diǎn):
泛型:SimpleChannelInboundHandler 強(qiáng)制指定一個(gè)消息類型,這樣可以避免手動(dòng)類型檢查,減少代碼出錯(cuò)的可能性。
自動(dòng)釋放消息:在處理完消息后,SimpleChannelInboundHandler 會(huì)自動(dòng)釋放消息,因此你不需要關(guān)心資源的回收。
簡(jiǎn)潔:適合處理特定類型的消息,代碼更簡(jiǎn)潔、可讀性更好。
public class WebSocketServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> { @Override protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception { // 直接處理 TextWebSocketFrame 消息,不需要類型檢查 String request = msg.text(); ctx.channel().writeAndFlush(new TextWebSocketFrame("Hello, " + request)); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { cause.printStackTrace(); ctx.close(); } }
WebSocket 幀類型
1.Text WebSocket Frame (文本幀)
用于傳輸文本數(shù)據(jù),通常是 UTF-8 編碼的字符串。
這類幀對(duì)應(yīng)于 TextWebSocketFrame 類。
TextWebSocketFrame 是一個(gè) 單一類型的消息框架,在 Netty 中用于表示 WebSocket 連接中傳輸?shù)奈谋鞠ⅰ?br />2.Binary WebSocket Frame (二進(jìn)制幀)
用于傳輸二進(jìn)制數(shù)據(jù)(如文件、圖片、視頻等)。
對(duì)應(yīng)于 BinaryWebSocketFrame 類。
這種類型的 WebSocket 幀通常是用于傳輸二進(jìn)制數(shù)據(jù)。
3.Close WebSocket Frame (關(guān)閉幀)
用于關(guān)閉 WebSocket 連接的幀。
對(duì)應(yīng)于 CloseWebSocketFrame 類。
發(fā)送此類型的幀可以通知對(duì)方關(guān)閉連接。
4.Ping WebSocket Frame (Ping 幀)
用于測(cè)試 WebSocket 連接是否正??捎茫ㄐ奶?。
對(duì)應(yīng)于 PingWebSocketFrame 類。
一般由客戶端或服務(wù)器發(fā)送,收到 Ping 后,另一方通常會(huì)發(fā)送一個(gè) Pong 幀作為響應(yīng)。
5.Pong WebSocket Frame (Pong 幀)
用于回應(yīng) Ping 幀。
對(duì)應(yīng)于 PongWebSocketFrame 類。
TextWebSocketFrame 的作用
TextWebSocketFrame 是專門用于處理 文本消息 的 WebSocket 幀,它繼承了 WebSocketFrame,并封裝了文本內(nèi)容。在實(shí)際的 WebSocket 應(yīng)用中,客戶端和服務(wù)器通常會(huì)通過(guò)發(fā)送和接收 TextWebSocketFrame 來(lái)交換信息,通常這些信息都是 UTF-8 編碼的文本。
到此這篇關(guān)于基于Netty實(shí)現(xiàn)的WebSocket的常用處理器的文章就介紹到這了,更多相關(guān)Netty WebSocket處理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決gateway報(bào)netty堆外內(nèi)存溢出io.netty.util.internal.OutOfDirectMemoryError
- springboot接入netty實(shí)現(xiàn)在線統(tǒng)計(jì)人數(shù)
- Netty如何自定義編碼解碼器
- 利用Netty+SpringBoot實(shí)現(xiàn)定時(shí)后端向前端推送數(shù)據(jù)
- springboot整合netty實(shí)現(xiàn)心跳檢測(cè)和自動(dòng)重連
- SpringCloud整合Netty集群實(shí)現(xiàn)WebSocket的示例代碼
- io.netty項(xiàng)目UDP實(shí)現(xiàn)方式
相關(guān)文章
使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟
這篇文章主要介紹了使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01創(chuàng)建SpringBoot項(xiàng)目的全過(guò)程
文章介紹了如何在IDEA專業(yè)版中創(chuàng)建SpringBoot項(xiàng)目,并通過(guò)一個(gè)簡(jiǎn)單的示例展示了如何使用SpringBoot輸出"hello,Springboot"2025-03-03Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門教程
這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門教程,包括基于TCP/IP和UDP協(xié)議的簡(jiǎn)單實(shí)例程序講解,需要的朋友可以參考下2016-01-01Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段
這篇文章主要介紹了Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java 多線程學(xué)習(xí)詳細(xì)總結(jié)
本文主要介紹 Java 多線程的知識(shí)資料,這里整理了詳細(xì)的多線程內(nèi)容,及簡(jiǎn)單實(shí)現(xiàn)代碼,有需要的朋友可以參考下2016-09-09關(guān)于spring中事務(wù)的傳播機(jī)制
這篇文章主要介紹了關(guān)于spring中事務(wù)的傳播機(jī)制,所謂事務(wù)傳播機(jī)制,也就是在事務(wù)在多個(gè)方法的調(diào)用中是如何傳遞的,是重新創(chuàng)建事務(wù)還是使用父方法的事務(wù),需要的朋友可以參考下2023-05-05spring-boot-maven-plugin:打包時(shí)排除provided依賴問(wèn)題
這篇文章主要介紹了spring-boot-maven-plugin:打包時(shí)排除provided依賴問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Spring TaskScheduler使用實(shí)例解析
這篇文章主要介紹了Spring TaskScheduler使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11詳解springboot-mysql-pagehelper分頁(yè)插件集成
這篇文章主要介紹了springboot-mysql-pagehelper分頁(yè)插件集成,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式)
這篇文章主要介紹了SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04