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
。然后就可以拦截这个事件,触发写了。
我有一个从 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
。然后就可以拦截这个事件,触发写了。