netty系列之:分離websocket處理器

shkstart發表於2022-01-10

netty的訊息處理


我們知道netty中所有的訊息處理都是透過handler來實現的,為了方便起見,netty提供了一個簡單的訊息處理類SimpleChannelInboundHandler,大家透過繼承它來重寫channelRead0方法即可:


public abstract class SimpleChannelInboundHandler extends ChannelInboundHandlerAdapter


可以看到SimpleChannelInboundHandler本身是帶有泛型I的,而這個I就是我們要探討的方向。


如果我們只需要處理String訊息,那麼可以這樣:


 @Override
    protected void channelRead0(ChannelHandlerContext ctx, String message)
        throws Exception {
           System.out.println(message);
       }
  }

同樣的,如果要同時處理HTTP和WebSocket訊息,只需要將I設定為不同的型別即可。


public class Server2FrameHandler extends SimpleChannelInboundHandler 

對於FullHttpRequest,我們有:


BinaryWebSocketFrame
CloseWebSocketFrame
ContinuationWebSocketFrame
PingWebSocketFrame
PongWebSocketFrame
TextWebSocketFrame

其中真正包含內容的是TextWebSocketFrame和BinaryWebSocketFrame,這裡我們對TextWebSocketFrame進行專門處理:


 if (frame instanceof TextWebSocketFrame) {
            // 將接收到的訊息轉換成為大寫
    String request = ((TextWebSocketFrame) frame).text();
       ctx.channel().writeAndFlush(new TextWebSocketFrame(request.toUpperCase(Locale.CHINA)));
       } else {
            String message = "不支援的Frame型別: " + frame.getClass().getName();
            throw new UnsupportedOperationException(message);
        }
  

 }

處理HTTP


對於HTTP請求中的FullHttpRequest,我們就安裝正常的HTTP服務請求的處理流程來就行。


編碼和解碼器


等等,我們是不是忘記了什麼東西?對,那就是編碼和解碼器。


沒關係,netty為我們提供了一個WebSocketServerProtocolHandler類,專門負責websocket的編碼和解碼問題。


對於剩下的Text或者Binary frame資料,會被交由pipline中的下一個handler進行處理。


HANDSHAKE_COMPLETE 和 HANDSHAKE_TIMEOUT。


最後,將WebSocketServerProtocolHandler加入到pipeline中,最終得到:

        pipeline.addLast(new HttpServerCodec());
        pipeline.addLast(new HttpObjectAggregator(65536));
        pipeline.addLast(new WebSocketServerCompressionHandler());
        pipeline.addLast(new WebSocketServerProtocolHandler(WEBSOCKET_PATH, null, true));
        pipeline.addLast(new Server2HttpHandler());
        pipeline.addLast(new Server2FrameHandler());
    }

總結
一個分離了HTTP請求和webSocket請求的伺服器就完成了。簡單直觀才是一個程式設計師追求的世界!

版權宣告:本文為原創文章,轉載請附上原文出處連結及本宣告。下載相關影片學習資料到尚矽谷官方網站


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27721058/viewspace-2851480/,如需轉載,請註明出處,否則將追究法律責任。

相關文章