2013-04-29 28 views
0

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

感谢

+0

当GPRS仍在准备连接 – autopilot 2013-04-29 07:05:10

回答

4

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

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

在这些情况下,连接尝试立即成功或失败。如果您想继续尝试,则需要将连接调用包装在某些代码中,以便在发生可重试故障时重试。 (编写代码以决定重试次数以及何时停止,以免浪费网络资源,电池电量等等由您决定)

+0

+1时,正在丢弃网络不可达。您应该进一步注意,超时参数只能用于减少平台超时,而不是增加平台超时,并且默认不是无穷大,与Javadoc相反。 – EJP 2013-04-29 08:37:28

0

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