有一个Java TCP客户端使用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);
事情并非那么简单。导致异常的原因是无法接收从套接字发送缓冲区传输的段的确认。与特定消息的相关性可以为零。例如,它可能是一条消息的一半而下一条消息的一半,它肯定是来自先前写入的数据而不是刚刚完成的数据。请记住,TCP中的“写入完成”只不过是成功缓冲套接字发送缓冲区中的数据。