2016-04-28 69 views
0

如果我有一个Selector接受sockets并将它们推送到其他线程处理的队列中,并且没有任何线程需要两分钟的套接字,并且客户端会推送数据但超时并断开连接。当一个thread然后采取其中一个现在关闭sockets,并试图从它读取,它会得到已由客户端发送的数据,或将没有什么在那里读?如果在读取字节之前断开连接,TCP套接字连接上的字节是否丢失?

+3

您无法从封闭的套接字读取数据。 – Berger

回答

1

这取决于'切断'的含义。

  • 如果您自己关闭了插座,您将从各种read()方法中获得SocketException: socket closed
  • 如果连接已被对等方正常关闭,则所有挂起的数据将在流信号结束前被读取。
  • 如果连接被中止重置,则所有未决数据都将丢失。
+0

好的,谢谢,我想第二个是我在服务器上看到的。你能澄清一下“流产复位”的含义吗? –

+1

有很多情况下,连接重置,而不是关闭很好:进程退出没有关闭(Windows);进程在套接字读缓冲区中仍然有未读数据时关闭套接字;主机接收已在其末尾关闭的连接数据......所有这些都会导致发出TCP RST。 – EJP