【发布时间】:2015-12-09 13:20:35
【问题描述】:
我为客户端-服务器通信编写了一个简单的网络引擎。它在 Windows 上完美运行,服务器知道客户端何时断开连接等(readLine() 抛出异常)。我试图将引擎移植到 Android 并发送和接收数据工作,但由于某种原因,服务器没有检测到套接字何时关闭(readLine() 仍然被阻止并且不会抛出任何异常)。我什至尝试将 Android 设备与互联网断开连接,但它仍然没有检测到关闭的套接字。我想到了一个解决办法,实现超时,当客户端长时间不发送东西时,服务器会认为他断开了连接,但这可能不是一个好的永久解决方案。
代码被try-catch异常包围:
String userInput;
BufferedReader stdIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((userInput = stdIn.readLine()) != null) {
//do something
}
【问题讨论】:
-
套接字是否被对等端有序关闭或关闭?
-
@alk 不知道你的意思是什么,但服务器需要知道客户端何时断开连接,即使客户端没有通过 socket.close() 强制关闭套接字,例如当应用程序处于强制终止,不能调用socket.close()。
-
stackoverflow 上有 100 多个问题,这些问题都与您提出的问题相同。其中之一是Why is it impossible, without attempting I/O, to detect that TCP socket was gracefully closed by peer?