在Android中获取“SocketException:Connection by peer reset”

时间:2012-06-26 12:31:27

标签: android localhost socketexception peer

我的应用需要通过http://127.0.0.1/...(本地主机网址)联系其正在使用的设备。

出于某种原因,当我到达那里有JSON内容的网站时,大约有50%的时间(可能正好是50%),我得到了例外:

  

java.net.SocketException:recvfrom failed:ECONNRESET(由对等方重置连接)

对于其他50%,我获得了非常好的结果。我试图进行民意调查(甚至民意调查之间的延迟很大),但我仍然得到同样奇怪的结果。

我搜索了互联网,也在这里,我不确定为什么会这样。对等方是否意味着客户端已经造成了这种情况?为什么会这样,我该如何处理?

有些网站说这是常见的事情,但我没有找到在这种情况下最好的事情。

6 个答案:

答案 0 :(得分:21)

好的,答案是它是服务器的错 - 它必须在每次请求后关闭连接。

可能是Android保留了一个连接池并使用旧的连接或类似的东西。

无论如何,现在它有效。


编辑:根据HttpURLConnection的API,这也可以在客户端解决:

  

此类返回的输入和输出流不会被缓冲。   大多数调用者应该使用BufferedInputStream包装返回的流   或BufferedOutputStream。只进行批量读取或写入的调用者可以   省略缓冲。将大量数据传输到或传输时   服务器,使用流来一次限制内存中的数据量。   除非您需要将整个身体一次放入记忆中,否则请将其处理为   流(而不是将整个主体存储为单个字节数组   或字符串)。

     

为减少延迟,此类可以重用相同的底层Socket   多个请求/响应对。因此,HTTP连接可能是   开放时间超过必要时间。调用disconnect()可能会返回   套接字到连接套接字池。可以禁用此行为   通过在发出之前将http.keepAlive系统属性设置为false   任何HTTP请求。 http.maxConnections属性可用于   控制每个服务器的空闲连接数。

取自: developer.android.com/reference/java/net/HttpURLConnection.html

答案 1 :(得分:6)

尝试在连接之前为 HttpURLConnection 设置此属性:

conn.setRequestProperty("connection", "close");

这将禁用" keep-alive "属性默认开启。

答案 2 :(得分:3)

我知道这是一个老话题。但这可能对某人有所帮助。

在我的情况下,此错误是由.NET WCF(soap)服务引起的。返回结果中的一个对象具有带有get {}属性但没有set {}属性的DataMember。

要进行序列化,每个DataMember都应该同时获得{}&设置{}可用。我实现了一个空集{}(由于我的业务规则而空),问题解决了。

我的场景是一个特定的糟糕的服务器实现,但也许它可以帮助有人在排除故障时节省时间。

答案 3 :(得分:1)

当我访问某些网页或下载文件(来自我的应用程序或Android浏览器)时,我遇到了很多Connection reset by peer

原来是我的3G运营商阻止了连接(例如禁止下载.exe文件。)

你在Wifi上遇到同样的问题吗?

答案 4 :(得分:0)

在我的情况下,问题已通过清除运营商生成的APN的代理地址和端口来解决。 正如我测试的那样,使用远程服务器的IP地址而不是域名也可以解决问题。

答案 5 :(得分:0)

在我们的情况下,问题出在服务器端(IIS中的应用程序池配置)。我通过将“最大工作进程数”设置为1来解决该问题。将其设置为大于1的值将启用Web Garden,这似乎是个问题。