- WebSocketServerProtocolHandler的本質是MessageToMessageDecoder<WebSocketFrame>,也就是別的handler把數據轉成WebSocketFrame之後,數據到它這兒,他才能處理,但是demo代碼裏沒有手動添加一個將ByteBuf轉成WebSocketFrame的handler,這個問題好像通義也沒有收錄,最終在chatgpt4o那裏找到了答案.
-
源碼裏,將關鍵decoder添加到pipeline的入口在pipeline.add(new WebSocketServerProtocolHandler("/ws"),DefaultPipeLine.addLast方法內,會調用callHandlerAddedInEventLoop方法,下面的調用鏈:callHandlerAddedInEventLoop -> callHandlerAdded0 -> ctx.callHandlerAdded() -> WebSocketServerProtocolHandler.handlerAdded -> 往pipeline添加WebSocketServerProtocolHandshakeHandler -> 上面的handshakeHandler.channelRead -> WebSocketServerHandshaker.handshake ->
channelPipeline.addBefore(ctx.name(), "wsencoder", this.newWebSocketEncoder()); channelPipeline.addBefore(ctx.name(), "wsdecoder", this.newWebsocketDecoder()); - handshakeHandler.channelRead是在基於http創建websocket連接時的握手時觸發