什么可能导致java.net.SocketException: recvfrom failed: ETIMEDOUT错误?

9

我的应用出现了这个问题。这是一个罕见且难以发现的问题。以下是堆栈信息:

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);
        } 

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

我猜测错误信息是“连接超时”。你连接的是哪个端口?它是开放的吗? - Amber
有点老了,但我可以通过将文件上传到服务器,然后禁用WiFi来100%重现这个问题。 - Coltin
2个回答

5
当收到“连接超时”错误时,我会考虑以下原因: 谢谢。

谢谢,我会看最后一个点。其他的不适合我的环境:我只有一个服务器和一个客户端来测试这个应用程序。 - Winte Winte
1
这不是连接超时错误。这是一个很少见的TCP errno 在接收时。请查看堆栈跟踪。这不是一个答案。 - user207421
1
亲爱的@EJP,您是高排名用户,我期待与您一起学习。但是在堆栈跟踪中明确指出“Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out)”。尽管似乎是在建立初始连接之后发生的,但由于某种原因连接超时了。与其对一个真正想要帮助的人进行贬低,提供更好的答案会更有用。问候。 - Luis
1
如果我有更好的答案,我会提供它。这是一个非常罕见的情况,在20多年的网络编程中我从未见过。连接超时参数和DNS与此无关:连接已经建立,现在失败了,很可能是由于重传超时。 - user207421

0

对我来说,这个错误发生的原因是:

  • 应该回复的一方意外关闭了连接。

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


难以置信。如果您继续发送,那将会导致“连接重置”,或者在尝试接收回复时出现流结束。 - user207421

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