如何处理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();
}
}