Netty websocket 客户端中的乒乓机制 - 每 5 分钟发送一次 ping 帧

Ping pong mechanism in Netty websocket client - send ping frame every 5 minutes

我有一个从 Websocket 服务器接收消息的客户端应用程序。

如果我必须在每 5 分钟不活动后对服务器执行一次 ping 操作,该怎么做? 我正在尝试使用 Netty 计时器来执行此操作。

    public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
            Channel ch = ctx.channel();
            WebSocketFrame frame = (WebSocketFrame)msg;
            if ((frame instanceof BinaryWebSocketFrame)) {
                BinaryWebSocketFrame binaryWebSocketFrame = (BinaryWebSocketFrame)frame;
                ByteBuf buffer = binaryWebSocketFrame.content();
                byte[] bytes = new byte[buffer.readableBytes()];
                buffer.getBytes(0, bytes);
                String data = new String(bytes, Charset.defaultCharset());
                JsonObject jsonObject = this.jsonParser.parse(data).getAsJsonObject();

                //ch.write(new PingWebSocketFrame()); //How to send ping every 5minutes. Is this the right place to send the ping message?

               //Is the below code a right way to of using the Timer:
                **Timer timer = new Timer() {
                @Override
                public Timeout newTimeout(TimerTask timerTask, long l, TimeUnit timeUnit) {
                    //return null;
                    TimerTask task = timeout -> ch.write(new PingWebSocketFrame(buffer));
                    return newTimeout(task, 5, TimeUnit.MINUTES);
                }
                @Override
                public Set<Timeout> stop() {
                    return null;
                    }
                };
                TimerTask task = timeout -> ch.write(new PingWebSocketFrame(buffer));
                timer.newTimeout(task, 5, TimeUnit.MINUTES);**

            }
            else if ((frame instanceof PingWebSocketFrame)) {
                frame.content().retain();
                ch.writeAndFlush(new PongWebSocketFrame(frame.content()));
                //return;
            }
            else if ((frame instanceof PongWebSocketFrame)) {
                System.out.println("WebSocket Client received pong");
            }
            else if ((frame instanceof CloseWebSocketFrame)) {
                ch.close();
            }
        }

您可以为此使用 ctx.executor().schedule(...)。除此之外,您还可以使用 IdleStateHandler 并让它在 5 分钟内没有 activity 时发出 IdleStateEvent。然后就可以拦截这个事件,触发写了。