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

标签 sockets tcp netty

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

  1. 当服务器收到来自其客户端的数据包时,服务器需要执行事务处理 A。
  2. 事务完成后,如果仍然连接,则返回消息给客户端。如果没有,做一些回滚过程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/

相关文章:

java - 典型的网络套接字超时

Golang TCP 服务器读取 HTTP/2 帧

java - 我在尝试使用 JSch 或 Socket 连接到 channel 时感到困惑和卡住了?

java - 如何使用 Java netty 正确限制带宽使用?

ios - 使用 NSStream 进行 Objective-C 套接字编程

android 异步任务 NetworkOnMainThreadException

java - 将Java Socket配置为在断开连接时快速失败?

android - 没有电缆的 ADB tcpip 命令

java - 为什么Netty不执行我的定时任务?

java - 我如何使用 Netty 记录单个客户端的流量和速度?