【问题标题】:How to find out which message causes exception in writting by Netty?如何找出哪条消息导致 Netty 写入异常?
【发布时间】:2018-05-30 09:05:59
【问题描述】:

有一个 Java TCP-Client 使用 Netty 连接到服务器。 在断开连接的通道中写入会导致异常。哪个问题导致此问题并不重要,但对我来说重要的是哪条消息未发送并导致异常。

如何[通过使用 ChannelPromise 或 ChannelFuture] 找到它?

在这里我只得到'f.isSuccess()==true',但这并不成功!消息未发送!

ChannelPromise promise = c.newPromise();
            promise.addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture f) {
                    System.err.println("<TCPIn: promise write operationComplete.");
                    if (!f.isSuccess()) {
                        System.err.println("<TCPIn[writting]: promise write ERROR:");
                        f.cause().printStackTrace();
                        f.channel().close();
                    }
                }
            });
channel.writeAndFlush(buf,promise);

【问题讨论】:

  • 你不能从监听器本身访问你的 buf 对象吗?这在大多数情况下都有效,但不适用于 EJP 在他的回答中所说的情况

标签: java tcp exception-handling netty tcpclient


【解决方案1】:

事情没那么简单。导致异常的原因是未能接收到从套接字发送缓冲区传输的段的确认。与特定消息的相关性可能为零。例如,它可能是一条消息的一半和下一条消息的一半,它肯定是来自先前写入的数据,而不是刚刚完成的数据。请记住,TCP 中的“写入完成”仅意味着成功缓冲套接字发送缓冲区中的数据。

【讨论】:

  • 好的,你说得对。那么如何确定消息是否完整发送?我只想知道消息是否发送成功。
  • 真正确保在 TCP 中成功接收到某些内容的唯一方法是发回“ACK 消息”。这将是您的协议本身的一部分,并将构建在 TCP 之上。
  • @NormanMaurer 我不想知道接收消息,我只想知道消息是否发送成功。
  • @NormanMaurer 发送 ACK 也取决于服务器。我只是一个客户。
  • 使用 TCP 时没有办法...您需要在使用 TCP 的协议中构建某种逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
相关资源
最近更新 更多