在写入/关闭由对等关闭的java.net.Socket的情况下会发生什么情况?
问题描述:
假设我有一个java.net.Socket
的实例,它是两个对等体(Windows
进程)之间连接的端点:我的进程和远程进程。远程进程退出并关闭其连接。现在我正在尝试write
和close
我的套接字。我希望write
和close
调用(或其中之一)失败并引发异常(就像在Unix套接字API中的SIGPIPE
信号),但它们会成功。在写入/关闭由对等关闭的java.net.Socket的情况下会发生什么情况?
在这种情况下java.net.Socket
的预期行为是什么?它与Unix套接字API行为有什么不同?它在Windows和Linux中的工作方式是否相同?
答
那么这种情况与管道有点不同,因为操作系统不一定知道另一端已经关闭了连接。所以...在理论上...对套接字的许多写入看起来可行。但是,假设远程机器仍然在网络上,那么作者应该最终得到一个异常。有一个很好的机会将它投入插座flush
或close
。
FWIW,java.net.Socket
的行为很大程度上取决于OS的协议栈的工作方式。
看起来'close'也不会引发任何异常。 – Michael
远程机器仍在网络上吗? –
是的。其中一个同行过程停滞了。 – Michael