標籤:title lock ext final content group font 使用 string
基於netty實現Webscoket相對來說就是相當簡單,所以本講中就不搞太複雜的了,給大家看一個類圖,和一段給pipeline添加handler,就可以完全瞭解hivemq如何處理的了,其實跟幾乎所有需要使用netty去支援websocket的處理一致。
public class WebsocketTransportChannelInitializer { public static final int MAX_CONTENT_LENGTH = 65536; private final WebsocketListener listener; public WebsocketTransportChannelInitializer(WebsocketListener listener) { this.listener = listener; } public void initChannel(Channel channel) {//添加http協議編碼/解碼 channel.pipeline().addBefore(Pipelines.ALL_CHANNEL_GROUP_HANDLER, Pipelines.HTTP_SERVER_CODEC, new HttpServerCodec());//添加HttpRequest訊息彙總器 channel.pipeline().addAfter(Pipelines.HTTP_SERVER_CODEC, Pipelines.HTTP_OBJECT_AGGREGATOR, new HttpObjectAggregator(MAX_CONTENT_LENGTH)); //添加WebSocketServerProtocolHandler String path = this.listener.getPath(); String subProtocols = getSubProtocols(); boolean allowExtensions = this.listener.getAllowExtensions();channel.pipeline().addAfter(Pipelines.HTTP_OBJECT_AGGREGATOR, Pipelines.WEBSOCKET_SERVER_PROTOCOL_HANDLER, new WebSocketServerProtocolHandler(path, subProtocols, allowExtensions, Integer.MAX_VALUE));//添加Websocket位元組碼Handlerchannel.pipeline().addAfter(Pipelines.WEBSOCKET_SERVER_PROTOCOL_HANDLER, Pipelines.WEBSOCKET_BINARY_FRAME_HANDLER, new WebsocketBinaryFrameHandler());//添加websocket框架類型handlerchannel.pipeline().addAfter(Pipelines.WEBSOCKET_BINARY_FRAME_HANDLER, Pipelines.WEBSOCKET_CONTINUATION_FRAME_HANDLER, new WebsocketContinuationFrameHandler());//添加websocket文本handlerchannel.pipeline().addAfter(Pipelines.WEBSOCKET_BINARY_FRAME_HANDLER, Pipelines.WEBSOCKET_TEXT_FRAME_HANDLER, new WebsocketTextFrameHandler());//添加mqtt message轉換成websocketchannel.pipeline().addAfter(Pipelines.WEBSOCKET_TEXT_FRAME_HANDLER, Pipelines.MQTT_WEBSOCKET_ENCODER, new MqttWebsocketEncoder()); } @VisibleForTesting String getSubProtocols() { return Joiner.on(",").join(this.listener.getSubprotocols()); }}
MQTT交流群:221405150
MQTT---HiveMQ源碼詳解(八)Netty-WebSocket