Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets Netty服务器如何知道客户端何时断开连接?_Sockets_Tcp_Netty - Fatal编程技术网

Sockets Netty服务器如何知道客户端何时断开连接?

Sockets Netty服务器如何知道客户端何时断开连接?,sockets,tcp,netty,Sockets,Tcp,Netty,我正在制作满足以下条件的Netty服务器: 当服务器从其客户机接收到数据包时,它需要执行事务处理 完成事务后,若它仍然连接,它将返回消息发送回客户端。如果没有,请执行一些回滚过程B 但我的问题是,当我发送回客户端时,服务器不知道它是否仍然连接。 在发送消息之前,我尝试了以下代码来找出它的连接。然而,即使客户端已经关闭了它的套接字,它也总是成功的。仅当客户端进程被强制终止时(例如Ctrl+C)才会失败 我认为这是因为TCP协议。若客户端正常断开连接,那个么FIN信号将被发送到服务器。所以它确实认为

我正在制作满足以下条件的Netty服务器:

  • 当服务器从其客户机接收到数据包时,它需要执行事务处理
  • 完成事务后,若它仍然连接,它将返回消息发送回客户端。如果没有,请执行一些回滚过程B
  • 但我的问题是,当我发送回客户端时,服务器不知道它是否仍然连接。

    在发送消息之前,我尝试了以下代码来找出它的连接。然而,即使客户端已经关闭了它的套接字,它也总是成功的。仅当客户端进程被强制终止时(例如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
    }