【问题标题】:Closing a TCP connection in an AsyncTask在 AsyncTask 中关闭 TCP 连接
【发布时间】:2012-09-17 22:49:08
【问题描述】:

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

在我的AsyncTask 中,我打开一个client socket 和一个带有bufferedreaderinputstream,用于连接到我的主机的TCP。我正在研究一种方法来检查主机是否已消失或仍然可用。所以我启动了一个线程来检查连接是否可用。

如果主机不在,线程会关闭我的异步任务中的套接字,以便重新连接。那工作得很好,我很自豪,但现在是棘手的部分。

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

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

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

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

【问题讨论】:

  • 看看答案here有没有帮助。

标签: java android sockets android-asynctask


【解决方案1】:

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

【讨论】:

  • 我描述的问题是因为 Froyo。在 2.2 版中,不可能由另一个线程异步关闭套接字流。具有 Java 已知的标准关闭条件。您必须调用 Socket.shutdownInput() 或 Socket.shutdownOutput()。这对我有用,其他人说那根本不起作用......无论如何,对流进行标准 close() 调用,即使您关闭套接字,它们也将保持活动状态。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多