簡體   English   中英

Netty 4.0:檢測 Websocket 握手是否完成

[英]Netty 4.0: Detect, if Websocket handshake is done

我想將舊的 Netty 3.x websocket 服務器重構為新版本 4.0。 Websocket 握手完成后,我需要向客戶端發送“歡迎消息”。 也許有人可以給我提示,我如何在 websocket 連接准備好使用時得到通知? 我正在玩websocket 服務器示例

WebSocketServerHandshaker.handshake()返回一個ChannelFuture ,在握手完成時得到通知。

如果 Websocket 握手完成,Netty 將引發用戶事件。

https://github.com/netty/netty/blob/netty-4.1.51.Final/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerProtocolHandshakeHandler.java#L101

Netty 4.0 中的 UserEvent 是WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE ,Netty 4.1 中是WebSocketServerProtocolHandler.HandshakeComplete

您可以在 WebSocketHandler 中覆蓋userEventTriggered方法:

public class WebSocketFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) {
        if (frame instanceof TextWebSocketFrame) {
            // Send the uppercase string back.
            String request = ((TextWebSocketFrame) frame).text();
            ctx.channel().writeAndFlush(new TextWebSocketFrame(request.toUpperCase()));
        } else {
            String message = "unsupported frame type: " + frame.getClass().getName();
            throw new UnsupportedOperationException(message);
        }
    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {
            WebSocketServerProtocolHandler.HandshakeComplete complete = (WebSocketServerProtocolHandler.HandshakeComplete) evt;
            System.out.println("New WebSocket handshake complete, uri:" + complete.requestUri());
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM