在安卓系统中出现java.net.socketexception: The operation timed out问题怎么办?

5
在我的应用程序中,我编写了连接到URL的代码,如下所示。
InputStream inputStream = new URL(url).openStream();    

我遇到了错误。我会发送我的日志记录。

12-17 15:06:55.065: WARN/System.err(4952): java.net.SocketException: The operation timed out
12-17 15:06:55.065: WARN/System.err(4952):     at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)
12-17 15:06:55.065: WARN/System.err(4952):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115)
12-17 15:06:55.065: WARN/System.err(4952):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
12-17 15:06:55.075: WARN/System.err(4952):     at java.net.Socket.connect(Socket.java:1055)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
12-17 15:06:55.085: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
12-17 15:06:55.085: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1152)
12-17 15:06:55.085: WARN/System.err(4952):     at java.net.URL.openStream(URL.java:653)

如何解决这个问题。

你知道URL是什么吗?你确定你的服务器正常运行吗? - Vladimir Ivanov
服务器是否可达并且接受连接? - mad
是的,我的服务器正常运行,这个错误有时候才会出现。 - ADIT
2个回答

13

这是因为有时服务器响应时间太长了。实际上,这也可能是由于网络速度过慢引起的,所以您无法完全控制它。如果您正在使用HttpClient,您可以增加超时时间:

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, WAIT_RESPONSE_TIMEOUT);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);

client = new DefaultHttpClient(httpParameters);

CONNECTION_TIMEOUT 是等待建立连接的时间。 WAIT_RESPONSE_TIMEOUT 是等待接收数据的时间 - 在您的情况下,这是您需要增加的时间。

底线:

  • 现在停止使用URL并开始使用HttpClient。
  • 您描述的情况在生产应用程序中非常常见,您需要为其提供支持。增加超时时间并不能总是有帮助,因为在网络缓慢时,您的应用程序将似乎停止运行。您可以添加重试机制或通知用户请求已失败并要求他再次尝试。

0
此外,我曾遇到这样的情况,即您传递了错误的URL,应用程序正在尝试检索数据,但从未找到。请检查您的URL,如果您纠正了它,以防万一它是错误的,那么请求就不会抛出错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接