netty系列之:分離websocket處理器
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- netty系列之:使用netty搭建websocket伺服器NettyWeb伺服器
- netty系列之:在netty中處理CORSNettyCORS
- netty系列之:使用netty搭建websocket客戶端NettyWeb客戶端
- Netty之非阻塞處理Netty
- netty系列之:netty中的frame解碼器Netty
- netty系列之:netty初探Netty
- netty系列之:netty中的核心解碼器jsonNettyJSON
- netty系列之:netty中的核心MessageToMessage編碼器Netty
- netty系列之:netty中的核心MessageToByte編碼器Netty
- netty系列之:netty中的自動解碼器ReplayingDecoderNetty
- netty系列之:netty中常用的物件編碼解碼器Netty物件
- netty系列之:netty中常用的xml編碼解碼器NettyXML
- netty系列之:netty中常用的字串編碼解碼器Netty字串編碼
- netty系列之:netty中的核心編碼器base64Netty
- netty系列之:netty中的核心編碼器bytes陣列Netty陣列
- netty系列之:netty中的懶人編碼解碼器Netty
- netty系列之:netty架構概述Netty架構
- netty系列之:netty對marshalling的支援Netty
- netty系列之:NIO和netty詳解Netty
- netty系列之:自定義編碼解碼器Netty
- netty系列之:使用netty實現支援http2的伺服器NettyHTTP伺服器
- netty系列之:在netty中使用proxy protocolNettyProtocol
- netty系列之:netty中的Channel詳解Netty
- netty系列之:netty中的ByteBuf詳解Netty
- Netty中自定義事件處理程式和監聽器Netty事件
- Netty Protobuf處理粘包分析Netty
- 事件分發之View事件處理事件View
- netty 之 非同步處理雙子星io.netty.util.concurrent.Future與io.netty.util.concurrent.PromiseNetty非同步Promise
- netty系列之:中國加油Netty
- netty系列之:channelPipeline詳解Netty
- netty系列之:channelHandlerContext詳解NettyContext
- netty系列之:channel和channelGroupNetty
- netty系列之:netty對SOCKS協議的支援Netty協議
- netty系列之:在netty中使用protobuf協議Netty協議
- 前後端分離下前端許可權處理後端前端
- netty系列之:java中的base64編碼器NettyJava
- netty系列之:搭建HTTP上傳檔案伺服器NettyHTTP伺服器
- Spring之後置處理器Spring