Sockets Netty服务器如何知道客户端何时断开连接?
我正在制作满足以下条件的Netty服务器:Sockets Netty服务器如何知道客户端何时断开连接?,sockets,tcp,netty,Sockets,Tcp,Netty,我正在制作满足以下条件的Netty服务器: 当服务器从其客户机接收到数据包时,它需要执行事务处理 完成事务后,若它仍然连接,它将返回消息发送回客户端。如果没有,请执行一些回滚过程B 但我的问题是,当我发送回客户端时,服务器不知道它是否仍然连接。 在发送消息之前,我尝试了以下代码来找出它的连接。然而,即使客户端已经关闭了它的套接字,它也总是成功的。仅当客户端进程被强制终止时(例如Ctrl+C)才会失败 我认为这是因为TCP协议。若客户端正常断开连接,那个么FIN信号将被发送到服务器。所以它确实认为
在发送消息之前,我尝试了以下代码来找出它的连接。然而,即使客户端已经关闭了它的套接字,它也总是成功的。仅当客户端进程被强制终止时(例如Ctrl+C)才会失败 我认为这是因为TCP协议。若客户端正常断开连接,那个么FIN信号将被发送到服务器。所以它确实认为writeAndFlush在某种程度上成功了,即使它没有成功 因此,我也尝试了以下代码,但它们的结果相同(总是返回true) 在我的情况下,不会发生“channelInactive”事件或“由对等方重置连接”异常。
这是我使用的Netty测试客户端代码的一部分
public void channelActive(ChannelHandlerContext ctx) {
ctx.writeAndFlush(message).addListener(ChannelFutureListener.CLOSE);
}
在我想要回复的时候,我怎么能注意到断开连接?可能是您应该覆盖下面的方法,并在通道关闭时查看控件是否转到此处
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
// write cleanup code
}
我认为不可能在netty中跟踪客户端是否连接,因为netty和客户端之间有一个抽象。可能是您应该重写下面的方法,并查看当通道关闭时控件是否转到此处
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
// write cleanup code
}
我认为不可能在netty中跟踪客户端是否连接,因为netty和客户端之间存在抽象。这与SMTP协议中可能发生的问题相同,邮件服务器已收到邮件,但客户端从未知道。解决此问题的方法之一是使用客户端生成的事务号,当客户端“重新连接”时,询问有关该事务的状态。即使检测到断开连接的客户端,也不应尝试回滚。他告诉你执行交易,你执行了:你不能向他确认,但这是问题,不是你的。解决方案是将事务设计为幂等的,即重新应用已应用的事务不会产生任何效果。这与SMTP协议中可能发生的问题相同,邮件服务器已收到邮件,但客户端从未知道。解决此问题的方法之一是使用客户端生成的事务号,当客户端“重新连接”时,询问有关该事务的状态。即使检测到断开连接的客户端,也不应尝试回滚。他告诉你执行交易,你执行了:你不能向他确认,但这是问题,不是你的。解决方案是设计事务,使其具有幂等性,即重新应用已应用的事务不会产生任何效果。谢谢您的建议,但这对我不起作用。。ChannelInactive事件不会流入pipleline,直到服务器通过显式调用ctx.close()自行关闭。谢谢您的建议,但它对我不起作用。。在服务器通过显式调用ctx.close()关闭自身之前,ChannelInactive事件不会流入pipleline。
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
// write cleanup code
}