1
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 重新传输(我们假设数据包丢失)会继续吗?捕获重新传输超时错误的最佳方法是什么?

4

1 回答 1

2

即使在程序退出后,TCP 也会继续尝试干净地关闭连接。通常建议应用程序自行执行关机。基本上,您执行以下步骤序列:

  1. 关闭发送方向的 TCP 连接,触发正常关闭序列。如果协议禁止对方发送任何数据,您也可以关闭接收方向的连接,但是,如果您这样做并且对方发送任何数据,可能会导致对方检测到异常关闭,因为它发送的数据将丢失。

  2. 继续读取连接,直到从另一端检测到干净或异常关闭。如果一切顺利,您将在收到对方发送的任何数据后立即检测到干净关机。

  3. 关闭句柄或删除连接的对象/引用。实际的 TCP 连接已经关闭。

于 2013-07-14T07:12:43.783 回答