0

我发现 android 中的套接字流连接有一些奇怪的行为。我想知道为什么它与 Java 不同。

在我的AsyncTask我打开一个client socket和一个与inputstream我的主机连接。我正在研究一种方法来检查主机是否已消失或仍然可用。所以我启动了一个线程来检查连接是否可用。bufferedreaderTCP

如果主机不在,线程将关闭我的 asynctask 中的套接字以进行可能的重新连接。那工作得很好,我很自豪,但现在是棘手的部分。

在 Java 中,我可以关闭套接字,Socket.close()并且阻塞的 readline 方法将被异常捕获。

在 Android 中,我必须调用Socket.shutdownInput()来打破 readline 块并捕获exception. 因为尝试关闭inputstream( BufferedReader) 对这种情况没有影响。即使我关闭了套接字,readline 仍然处于活动状态并处于阻塞状态。

谁能解释一下这种行为?我知道我必须遵守关闭条件,但这种行为非常不同。

编辑:谢谢 yorkw 的链接。这是完全相同的问题,因为我的手机上运行着 Froyo。

4

1 回答 1

0

尝试在 android 端和服务器端检查 SO_LINGER 时间。理想情况下,您应该在 Andoroid 上的 SO_LINGER + 服务器上的 SO_LINGER 之后在服务器端获得 IOException。如果这无助于真正检查您的 Async 任务是否确实关闭了套接字,请尝试多次执行相同的活动,并查看是否出现异常,指出已超过最大打开文件数。至少那时您会知道问题出在Android方面。

于 2012-09-17T14:49:08.963 回答