基于Netty實現(xiàn)WebSocket的常用處理器及區(qū)別解析
ChannelInboundHandlerAdapter 和 SimpleChannelInboundHandler 都是 Netty 提供的處理器基類。
它們之間的主要區(qū)別:
ChannelInboundHandlerAdapter
ChannelInboundHandlerAdapter 是一個通用的處理器基類,繼承自 ChannelInboundHandler,用于處理 入站消息(即從客戶端到服務(wù)端的消息)。
它不做任何具體的消息類型限制,因此適用于處理各種類型的入站消息。
你可以重寫 channelRead 方法來處理不同類型的消息,或者重寫 exceptionCaught 等方法處理異常。
特點:
通用:沒有指定消息類型,你可以在 channelRead 方法中處理任何類型的入站消息。
靈活:你需要手動判斷消息的類型,進行相應(yīng)的處理。
適用場景:適用于處理多種不同類型的消息,或者當(dāng)你希望處理多個類型的消息時。
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 的一個子類,它專門用于處理某一特定類型的入站消息。你需要在創(chuàng)建 SimpleChannelInboundHandler 時指定消息類型 T(如 TextWebSocketFrame、ByteBuf 等)。
它在處理完每個消息后會自動釋放該消息,因此避免了手動管理消息的生命周期(比如調(diào)用 ReferenceCountUtil.release)。
如果消息類型不匹配,它會拋出異常,這使得它更適合處理單一類型的消息,簡化了類型檢查。
特點:
泛型:SimpleChannelInboundHandler 強制指定一個消息類型,這樣可以避免手動類型檢查,減少代碼出錯的可能性。
自動釋放消息:在處理完消息后,SimpleChannelInboundHandler 會自動釋放消息,因此你不需要關(guā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 編碼的字符串。
這類幀對應(yīng)于 TextWebSocketFrame 類。
TextWebSocketFrame 是一個 單一類型的消息框架,在 Netty 中用于表示 WebSocket 連接中傳輸?shù)奈谋鞠ⅰ?br />2.Binary WebSocket Frame (二進制幀)
用于傳輸二進制數(shù)據(jù)(如文件、圖片、視頻等)。
對應(yīng)于 BinaryWebSocketFrame 類。
這種類型的 WebSocket 幀通常是用于傳輸二進制數(shù)據(jù)。
3.Close WebSocket Frame (關(guān)閉幀)
用于關(guān)閉 WebSocket 連接的幀。
對應(yīng)于 CloseWebSocketFrame 類。
發(fā)送此類型的幀可以通知對方關(guān)閉連接。
4.Ping WebSocket Frame (Ping 幀)
用于測試 WebSocket 連接是否正??捎茫ㄐ奶?。
對應(yīng)于 PingWebSocketFrame 類。
一般由客戶端或服務(wù)器發(fā)送,收到 Ping 后,另一方通常會發(fā)送一個 Pong 幀作為響應(yīng)。
5.Pong WebSocket Frame (Pong 幀)
用于回應(yīng) Ping 幀。
對應(yīng)于 PongWebSocketFrame 類。
TextWebSocketFrame 的作用
TextWebSocketFrame 是專門用于處理 文本消息 的 WebSocket 幀,它繼承了 WebSocketFrame,并封裝了文本內(nèi)容。在實際的 WebSocket 應(yīng)用中,客戶端和服務(wù)器通常會通過發(fā)送和接收 TextWebSocketFrame 來交換信息,通常這些信息都是 UTF-8 編碼的文本。
到此這篇關(guān)于基于Netty實現(xiàn)的WebSocket的常用處理器的文章就介紹到這了,更多相關(guān)Netty WebSocket處理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用jekins自動構(gòu)建部署java maven項目的方法步驟
這篇文章主要介紹了使用jekins自動構(gòu)建部署java maven項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識入門教程
這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識入門教程,包括基于TCP/IP和UDP協(xié)議的簡單實例程序講解,需要的朋友可以參考下2016-01-01Mybatis如何按順序查詢出對應(yīng)的數(shù)據(jù)字段
這篇文章主要介紹了Mybatis如何按順序查詢出對應(yīng)的數(shù)據(jù)字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01spring-boot-maven-plugin:打包時排除provided依賴問題
這篇文章主要介紹了spring-boot-maven-plugin:打包時排除provided依賴問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04詳解springboot-mysql-pagehelper分頁插件集成
這篇文章主要介紹了springboot-mysql-pagehelper分頁插件集成,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07SpringAMQP消息隊列(SpringBoot集成RabbitMQ方式)
這篇文章主要介紹了SpringAMQP消息隊列(SpringBoot集成RabbitMQ方式),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04