【发布时间】:2013-07-14 06:59:30
【问题描述】:
public static void main(String args[]){
byte[] message = ...
Socket socket = ...
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
dOut.write(message); //#1
dOut.close();
socket.close();
}
假设第 1 行将数据放入缓冲区等待刷新到远程机器。之后,流和套接字关闭。
我们假设,在发送过程中,网络发生了一些未知的问题,我们的操作系统会重新发送缓冲区中的数据包,直到 TCP 重传超时。
我想知道如何在 Java 程序中捕获此异常?因为上面的代码已经将数据发送到缓冲区,并且可能关闭了流和套接字(并且可能退出了 Java 主体),所以将所有其他工作(TCP 相关,重新传输)留给了操作系统。
我的问题是,即使 Java 程序退出,TCP 重新传输(我们假设数据包丢失)会继续吗?捕获重传超时错误的最佳方法是什么?
【问题讨论】:
-
不存在“Java TCP 重新传输超时”或“Java TCP”之类的东西。只有平台的 TCP 堆栈及其行为。
-
嗨@EJP,我知道 dOut.write 只有在 TCP 发送缓冲区已满时才会被阻止。假设dOut.write由于缓冲区已满而被阻塞,并且网络发送数据有问题,因此TCP继续重新发送数据。这种情况下,dOut.write会在TCP超过最大重传时间后抛出异常吗?感谢您的帮助。
标签: java sockets tcp operating-system