有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Netty 4.0:检测Websocket握手是否完成

我想重构一个旧的Netty 3。将websocket服务器升级到新版本4.0。Websocket握手完成后,我需要向客户发送“欢迎信息”。也许有人能给我一个提示,如何在websocket连接准备就绪后立即通知我?我在玩websocket server example


共 (2) 个答案

  1. # 1 楼答案

    如果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中的UserEvent是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);
            }
        }
    }
    
  2. # 2 楼答案

    WebSocketServerHandshaker.handshake()返回一个ChannelFuture,在握手完成时收到通知