提问人:Software Qustions 提问时间:7/28/2015 更新时间:7/29/2015 访问量:2052
Netty 客户端向服务器发送保持活动状态
Netty client send keep alive to server
问:
我想使用 Netty 编写从客户端到服务器的 keep alive 命令。我发现了 .我不知道如何在客户端解决问题,这是我的代码: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
答:
2赞
Frederic Brégier
7/29/2015
#1
根据 JavaDoc,会根据通道的当前状态生成新事件:IdleStateHandler
IdleState#READER_IDLE
读取操作超时IdleState#WRITER_IDLE
用于写入操作超时IdleState#ALL_IDLE
用于读/写操作的超时
然后,您需要在处理程序中实现对这些事件的处理(例如,取自此处的文档):
// 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 请求......您想要处理 keep-alive 的方式与您的协议相关。
这可以在客户端和服务器端完成。
评论