如何处理Netty 4中的乒乓球框架? 类ClientWebSocketHandler扩展了SimpleChannelInboundHandler{ @凌驾 受保护的无效channelRead0(ChannelHandlerContext ctx、WebSocketFrame)引发异常{ } }

如何处理Netty 4中的乒乓球框架? 类ClientWebSocketHandler扩展了SimpleChannelInboundHandler{ @凌驾 受保护的无效channelRead0(ChannelHandlerContext ctx、WebSocketFrame)引发异常{ } },netty,Netty,我只能在channelRead0 如何处理PingWebSocketFrame和PongWebSocketFrame,我想知道客户端何时发送Ping/Pong在任何WebSocketFrame到达SimpleChannelInboundHandler之前,Netty已经收到了PingWebSocketFrame和PongWebSocketFrame。有关其处理逻辑,请参阅摘要。类似于: (知道channelRead0在5.0版本后被弃用,应该删除或不支持,如果您想要最新答案,请在评论中询问) /

我只能在
channelRead0


如何处理
PingWebSocketFrame
PongWebSocketFrame
,我想知道客户端何时发送Ping/Pong

在任何WebSocketFrame到达SimpleChannelInboundHandler之前,Netty已经收到了PingWebSocketFrame和PongWebSocketFrame。有关其处理逻辑,请参阅摘要。

类似于: (知道channelRead0在5.0版本后被弃用,应该删除或不支持,如果您想要最新答案,请在评论中询问)

/**
**请记住,此方法将重命名为
*{@code messageReceived(ChannelHandlerContext,I)}在5.0中。
*/
@凌驾
public void channelRead0(ChannelHandlerContext ctx,Object msg)引发异常{
通道ch=ctx.Channel();
如果(!handshaker.isHandshakeComplete()){
握手器。完成握手(ch,(FullHttpResponse)msg);
l、 错误(“WebSocket客户端已连接!”);
handshakeFuture.setSuccess();
返回;
}
if(msg instanceof FullHttpResponse){
FullHttpResponse响应=(FullHttpResponse)消息;
抛出新的IllegalStateException(“意外的FullHttpResponse(getStatus=“+response.status()+”,content=”
+response.content().toString(CharsetUtil.UTF_8)+’);
}
WebSocketFrame=(WebSocketFrame)消息;
if(TextWebSocketFrame的帧实例){
TextWebSocketFrame textFrame=(TextWebSocketFrame)frame;
l、 信息(“WebSocket客户端收到消息:{}”,textFrame.text());
//如果服务器在长时间没有ping发送时关闭套接字,则需要
//最好用定时器发送ping
//这都是选择价格的问题
ch.write(新的PingWebSocketFrame());
}else if(PongWebSocketFrame的帧实例){
l、 信息(“WebSocket客户端收到pong”);
}else if(CloseWebSocketFrame的帧实例){
l、 信息(“WebSocket客户端接收到关闭”);
ch.close();
}
}

如何使用计时器发送ping?请尝试封闭您的频道。使用类似这样的计时器写入:``公共无效channelConnected(ChannelHandlerContext ctx,ChannelStateEvent e)引发异常{…this.timerLocal.newTimeout(new TimerTask(){公共无效运行(超时)引发异常{Channel ch=ctx.getChannel();ch.write(“数据”);},25,TimeUnit.SECONDS);…}```
class ClientWebSocketHandler extends SimpleChannelInboundHandler<WebSocketFrame> {

  @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {

    }
}
/**
 * * <strong>Please keep in mind that this method will be renamed to
 * {@code messageReceived(ChannelHandlerContext, I)} in 5.0.</strong>
 */
@Override
public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
    Channel ch = ctx.channel();
    if (!handshaker.isHandshakeComplete()) {
        handshaker.finishHandshake(ch, (FullHttpResponse) msg);
        l.error("WebSocket Client connected!");
        handshakeFuture.setSuccess();
        return;
    }

    if (msg instanceof FullHttpResponse) {
        FullHttpResponse response = (FullHttpResponse) msg;
        throw new IllegalStateException("Unexpected FullHttpResponse (getStatus=" + response.status() + ", content="
            + response.content().toString(CharsetUtil.UTF_8) + ')');
    }


    WebSocketFrame frame = (WebSocketFrame) msg;
    if (frame instanceof TextWebSocketFrame) {
        TextWebSocketFrame textFrame = (TextWebSocketFrame) frame;
        l.info("WebSocket Client received message:{} ", textFrame.text());

        //needed if the server close the socket if no ping send for long
        //better to send the ping with a timer
        // it allwos to choose the rate
        ch.write(new PingWebSocketFrame());

    } else if (frame instanceof PongWebSocketFrame) {
        l.info("WebSocket Client received pong");
    } else if (frame instanceof CloseWebSocketFrame) {
        l.info("WebSocket Client received closing");
        ch.close();
    }
}