我正在制作满足以下条件的 Netty 服务器:
- 当服务器收到来自其客户端的数据包时,服务器需要执行事务处理 A。
- 事务完成后,如果仍然连接,则返回消息给客户端。如果没有,做一些回滚过程B。
但我的问题是,当我发送回客户端时,服务器不知道它是否仍然连接。
在发送消息之前,我已经尝试按照代码找出它的连接。然而,即使客户端已经关闭了它的套接字,它也总是成功。仅当客户端进程被强制终止时才会失败(例如 Ctrl+C)
final ChannelFuture cf = inboundChannel.writeAndFlush(resCodec);
cf.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
if (future.isSuccess()) {
inboundChannel.close();
} else {
try {
// do Rollback Process B Here
}
}
});
我认为这是因为 TCP 协议(protocol)。如果客户端正常断开连接,则向服务器发送 FIN 信号。所以它确实认为 writeAndFlush 以某种方式成功,即使它没有成功。
所以我也尝试了下面的代码,但是它们有相同的结果(总是返回 true)
if(inboundChannel.isActive()){
inboundChannel.writeAndFlush(msg);
} else{
// do RollBack B
}
// Similar codes using inboundChannel.isOpen(), inboundChannel.isWritable()
在我的案例中,既没有发生“channelInactive”事件,也没有发生“Connection Reset by Peer”异常。
这是我使用的Netty测试客户端代码的一部分。
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(message).addListener(ChannelFutureListener.CLOSE);
}
如何在我要回复时注意到断开连接?
最佳答案
也许你应该覆盖下面的方法,看看当 channel 关闭时控件是否转到这里。
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
// write cleanup code
}
我认为在 netty 中不可能跟踪客户端是否连接,因为 netty 和客户端之间存在抽象。
关于sockets - Netty 服务器如何知道客户端何时断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169033/