如何处理Netty 4中的PING / PONG帧?

时间:2016-07-26 12:58:51

标签: netty

class ClientWebSocketHandler extends SimpleChannelInboundHandler<WebSocketFrame> {

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

    }
}

我只能收到TextWebSocketFrame&amp; BinaryWebSocketFrame

中的channelRead0

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

2 个答案:

答案 0 :(得分:2)

像那样: (知道时间channelRead0已被弃用,应该在5.0 verserion之后删除或不支持,如果你想要最新的答案,请在评论中提问)

/**
 * * <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();
    }
}

答案 1 :(得分:0)

Netty在任何WebSocketFrame到达您的SimpleChannelInboundHandler之前已收到PingWebSocketFrame和PongWebSocketFrame。请参阅abstract WebSocketProtocolHandler以获取其处理逻辑。