Netty 客户端发送 keep alive 到服务器
Netty client send keep alive to server
我想使用 Netty 编写从客户端到服务器的保持活动命令。我发现了 IdleStateHandler
的选项。我不知道如何解决客户端的问题,这是我的代码:
public void connect() {
workerGroup = new NioEventLoopGroup();
Bootstrap bs = new Bootstrap();
bs.group(workerGroup).channel(NioSocketChannel.class);
bs.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(0, 0, 300));
ch.pipeline().addLast("logger", new LoggingHandler());
ch.pipeline().addLast("commandDecoder", new CuCommandDecoder());
ch.pipeline().addLast("commandEncoder", new CuCommandEncoder());
}
});
将 IdleStateHandler
添加到频道后。处理代码应该在哪里?
它是实现 IdleStateHandler
的新方法吗?
根据 JavaDoc,IdleStateHandler
将根据通道的当前状态生成新事件:
IdleState#READER_IDLE
读取操作超时
IdleState#WRITER_IDLE
写入操作超时
IdleState#ALL_IDLE
两个 Read/Write 操作超时
然后您需要在处理程序中实现对这些事件的处理(示例取自 here 的文档):
// Handler should handle the IdleStateEvent triggered by IdleStateHandler.
public class MyHandler extends ChannelDuplexHandler {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent e = (IdleStateEvent) evt;
if (e.state() == IdleState.READER_IDLE) {
ctx.close();
} else if (e.state() == IdleState.WRITER_IDLE) {
ctx.writeAndFlush(new PingMessage());
}
}
}
}
此处示例将在第一个 READ 空闲时关闭,并尝试在 Write 空闲时发送 ping。还可以实现 "pong" 响应,也可以将读取部分更改为 ping 请求...您希望处理保持活动状态的方式与您的协议相关。
这可以在客户端和服务器端完成。
我想使用 Netty 编写从客户端到服务器的保持活动命令。我发现了 IdleStateHandler
的选项。我不知道如何解决客户端的问题,这是我的代码:
public void connect() {
workerGroup = new NioEventLoopGroup();
Bootstrap bs = new Bootstrap();
bs.group(workerGroup).channel(NioSocketChannel.class);
bs.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(0, 0, 300));
ch.pipeline().addLast("logger", new LoggingHandler());
ch.pipeline().addLast("commandDecoder", new CuCommandDecoder());
ch.pipeline().addLast("commandEncoder", new CuCommandEncoder());
}
});
将 IdleStateHandler
添加到频道后。处理代码应该在哪里?
它是实现 IdleStateHandler
的新方法吗?
根据 JavaDoc,IdleStateHandler
将根据通道的当前状态生成新事件:
IdleState#READER_IDLE
读取操作超时IdleState#WRITER_IDLE
写入操作超时IdleState#ALL_IDLE
两个 Read/Write 操作超时
然后您需要在处理程序中实现对这些事件的处理(示例取自 here 的文档):
// Handler should handle the IdleStateEvent triggered by IdleStateHandler.
public class MyHandler extends ChannelDuplexHandler {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent e = (IdleStateEvent) evt;
if (e.state() == IdleState.READER_IDLE) {
ctx.close();
} else if (e.state() == IdleState.WRITER_IDLE) {
ctx.writeAndFlush(new PingMessage());
}
}
}
}
此处示例将在第一个 READ 空闲时关闭,并尝试在 Write 空闲时发送 ping。还可以实现 "pong" 响应,也可以将读取部分更改为 ping 请求...您希望处理保持活动状态的方式与您的协议相关。
这可以在客户端和服务器端完成。