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重新传输(我们假设数据包丢失)会继续吗?捕获重新传输超时错误的最佳方法是什么?
答案 0 :(得分:2)
即使程序退出,TCP也会继续尝试干净地关闭连接。通常建议应用程序自行执行关闭。基本上,您执行以下一系列步骤:
Shutdown the TCP connection in the send direction触发正常关闭序列。如果协议禁止另一方发送任何数据,您也可以在接收方向上关闭连接,但是,如果您这样做并且另一方发送任何数据,则可能导致另一方检测到异常关闭它发送的数据将丢失。
继续读取连接,直到从另一端检测到干净或异常关闭。如果一切顺利,只要您收到对方发送的任何数据,您就会检测到干净的关机。
关闭句柄或删除对象的对象/引用。实际的TCP连接已经关闭。