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

时间:2017-09-12 06:05:19

标签: sockets tcp netty

我正在使Netty Server满足以下条件:

  1. 服务器需要在从客户端接收数据包时执行事务处理A.
  2. 完成交易后,如果仍然连接,它会向客户端发回返回消息。如果没有,请执行一些回滚过程B.
  3. 但我的问题是,当我发回客户端时,服务器不知道它是否仍然连接。

    在尝试发送消息之前,我尝试使用代码来确定其连接。但是,即使客户端已经关闭其套接字,它也总是成功。只有当客户端进程被强行杀死时才会失败(例如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);        
        }
    


    在我想回复时如何注意断线?

1 个答案:

答案 0 :(得分:0)

可能是你应该覆盖以下方法,看看当频道关闭时控件是否在这里。

@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
    // write cleanup code
}

我认为无法跟踪客户端是否在netty中连接,因为netty和客户端之间存在抽象。