gpt4 book ai didi

java - Netty客户端向服务器发送保持 Activity 状态

转载 作者:行者123 更新时间:2023-11-30 03:19:32 27 4
gpt4 key购买 nike

我想使用 Netty 从客户端向服务器编写保持 Activity 命令。我发现了 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添加到 channel 后。处理代码应该在哪里?它是实现 IdleStateHandler 的新方法吗?

最佳答案

根据JavaDoc,IdleStateHandler会根据 channel 的当前状态生成新的事件:

  • IdleState#READER_IDLE 用于读取操作超时
  • IdleState#WRITER_IDLE 用于写入操作超时
  • IdleState#ALL_IDLE 用于读/写操作超时

然后您需要在处理程序中实现这些事件的处理(示例取自 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 请求...您想要处理与协议(protocol)相关的保持 Activity 的方式。

这可以在客户端和服务器端完成。

关于java - Netty客户端向服务器发送保持 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31674898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com