class ClientWebSocketHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
}
}
我只能收到TextWebSocketFrame
&amp; BinaryWebSocketFrame
channelRead0
如何处理PingWebSocketFrame
和PongWebSocketFrame
,我想知道客户端何时发送Ping / Pong
答案 0 :(得分:2)
/**
* * <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以获取其处理逻辑。