connect()方法忽略其超时值

时间:2013-04-29 07:03:45

标签: java android sockets

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

由于

2 个答案:

答案 0 :(得分:4)

连接超时适用于远程服务器没有响应的情况。在其他情况下,超时不适用; e.g。

  • 连接成功时,
  • 当远程服务器拒绝连接时,
  • 当网络层显示“无路由到主机”时
  • 当网络层显示“无网络路由”/“网络无法访问”时。

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

答案 1 :(得分:0)

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