2012-11-30 86 views
9

我在我的应用程序中遇到了这个问题。这是罕见的和难以发现的。这是一个堆栈:什么可能是java.net.SocketException的原因:recvfrom失败:ETIMEDOUT?

2012-11-30 08:42:22.745myapp.package.MyCommand is failed.java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) 
at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:542) 
at libcore.io.IoBridge.recvfrom(IoBridge.java:506) 
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82) 
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:180) 
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:428) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:252) 
at myapp.package.HttpCommand.executeRequest(HttpCommand.java:176) 
at myapp.package.HttpCommand.execute(HttpCommand.java:83) 
at myapp.package.NetworkService$1.run(NetworkService.java:60) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out) 
at libcore.io.Posix.recvfromBytes(Native Method) 
at libcore.io.Posix.recvfrom(Posix.java:131) 
at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164) 
at libcore.io.IoBridge.recvfrom(IoBridge.java:503) 
... 26 more 

在我的应用我有执行所有命令的服务器类:

private static final AndroidHttpClient client = AndroidHttpClient.newInstance(TAG); 

HttpUriRequest request = getRequest(context); 
     HttpResponse response = client.execute(request); 
     final int statusCode = response.getStatusLine().getStatusCode(); 
     if (HttpStatus.SC_OK == statusCode) { 
      final String json = EntityUtils.toString(response.getEntity()); 
      handleResult(json); 
      Log.i(TAG, json); 
     } else { 
      handleError(SERVER_CODE); 
     } 

你有任何想法是什么这个问题的原因是什么?

+0

我想这个错误说“连接超时”。你连接了哪个端口?它是打开 ? – Amber

+0

这种旧的,但我可以通过上传一个文件到服务器,然后禁用wifi 100%重现这个。 – Coltin

回答

4

当收到“连接超时”的错误,我会找:

问候。

+0

谢谢,我会看到最后一点。其他人不适合我的环境:我有一个服务器和一个客户端测试这个应用程序。 –

+1

这不是连接超时错误。这是一个罕见的TCP errno *接收时。*请参阅堆栈跟踪。没有答案。 – EJP

+1

亲爱的@EJP,你是高度评价用户,我会期待与你一起学习。但是在追踪记录中明确指出'由于:libcore.io.ErrnoException:recvfrom失败:ETIMEDOUT(连接超时)'。虽然在初始连接完成后发生接缝,但出于某种原因连接超时。对真正想要帮助的人表示怀疑,提供更好的答案会更有用。问候。 – Luis

0

对于我这个错误发生时:

  • 这应该回答的一方意外关闭连接。

我的情况:Android通过端口8080上的普通套接字连接到微处理器。问题是uC在实际发送“OK”回复之前关闭连接。发送显然是在这个uC(ESP8266)推迟的操作。解决方案是注销关闭连接的线路(这一行代码来自之前的版本,其中没有回复意图)。 Rgds。

+0

很难相信。如果您一直在发送数据,或者数据流结束尝试收到回复,则会导致“连接重置”。 – EJP

相关问题