我正在使Netty Server满足以下条件:
但我的问题是,当我发回客户端时,服务器不知道它是否仍然连接。
在尝试发送消息之前,我尝试使用代码来确定其连接。但是,即使客户端已经关闭其套接字,它也总是成功。只有当客户端进程被强行杀死时才会失败(例如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协议。如果客户端正常断开连接,则FIN信号将发送到服务器。所以它确实认为writeAndFlush即使不成功也会以某种方式成功。
所以我也尝试过跟随代码,但这些结果具有相同的结果(总是返回true)
if(inboundChannel.isActive()){
inboundChannel.writeAndFlush(msg);
} else{
// do RollBack B
}
// Similar codes using inboundChannel.isOpen(), inboundChannel.isWritable()
在我的情况下,'channelInactive'事件和'Peer连接重置'异常都不会发生。
这是我使用的Netty测试客户端代码的一部分。
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(message).addListener(ChannelFutureListener.CLOSE);
}
在我想回复时如何注意断线?
答案 0 :(得分:0)
可能是你应该覆盖以下方法,看看当频道关闭时控件是否在这里。
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
// write cleanup code
}
我认为无法跟踪客户端是否在netty中连接,因为netty和客户端之间存在抽象。