0

我正在开发一个需要通过 TCP 套接字连接发送消息的 Android 应用程序。我已经按照connect(SocketAddress endpoint, int timeout)方法设置了超时值。现在该connect()方法会阻塞,直到超时到期,并且SocketException仅当服务器离线时才抛出 a。在所有其他情况下,如网络禁用、网络不可达等,超时值将被忽略,该方法直接抛出SocketException (ENETUNREACH). 即使在这种情况下,我如何确保超时有效?如果需要,将提供其他信息。

谢谢

4

2 回答 2

4

连接超时适用于您没有从远程服务器获得响应的情况。在其他情况下,超时不适用;例如

  • 当连接成功时,
  • 当远程服务器拒绝连接时,
  • 当网络层说“没有到主机的路由”时
  • 当网络层说“没有路由到网络”/“网络不可达”时。

在这些情况下,连接尝试会立即成功或失败。如果您想继续尝试,您需要将连接调用包装在一些代码中,以便在可重试失败的情况下重试。(并且由您编写代码来决定重试的频率,以及何时停止,以免浪费网络资源,电池充电等)

于 2013-04-29T07:30:09.473 回答
0

这是该方法的预期行为。超时仅在建立连接需要时间时才相关。如果确定由于其他原因无法建立连接,立即抛出错误,不浪费时间。这就是该方法在内部实现的方式。

于 2013-04-29T07:30:27.390 回答