在写入/关闭由对等关闭的java.net.Socket的情况下会发生什么情况?

问题描述:

假设我有一个java.net.Socket的实例,它是两个对等体(Windows进程)之间连接的端点:我的进程和远程进程。远程进程退出并关闭其连接。现在我正在尝试writeclose我的套接字。我希望writeclose调用(或其中之一)失败并引发异常(就像在Unix套接字API中的SIGPIPE信号),但它们会成功。在写入/关闭由对等关闭的java.net.Socket的情况下会发生什么情况?

在这种情况下java.net.Socket的预期行为是什么?它与Unix套接字API行为有什么不同?它在Windows和Linux中的工作方式是否相同?

那么这种情况与管道有点不同,因为操作系统不一定知道另一端已经关闭了连接。所以...在理论上...对套接字的许多写入看起来可行。但是,假设远程机器仍然在网络上,那么作者应该最终得到一个异常。有一个很好的机会将它投入插座flushclose

FWIW,java.net.Socket的行为很大程度上取决于OS的协议栈的工作方式。

+0

看起来'close'也不会引发任何异常。 – Michael

+0

远程机器仍在网络上吗? –

+0

是的。其中一个同行过程停滞了。 – Michael