41

http://127.0.0.1/...我的应用程序需要通过(本地主机 URL)联系它正在使用的同一设备。

出于某种原因,当我到达带有 JSON 内容的网站时,大约有 50% 的时间(也许正好是 50%)出现异常:

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

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

我已经搜索了互联网和这里,但我不确定它为什么会发生。peer是否意味着是客户端造成的?为什么会发生,我应该如何处理?

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

4

6 回答 6

22

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

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

无论如何,现在它可以工作了。


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

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

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

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

于 2012-06-27T13:30:35.247 回答
7

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

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

这将禁用默认开启的“ keep-alive ”属性。

于 2015-11-26T15:06:56.567 回答
3

这是我知道的一个旧线程。但这可能会对某人有所帮助。

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

要进行序列化,每个 DataMember 都应该有 get{} 和 set{} 可用。我实现了一个空集{}(由于我的业务规则而为空),问题就解决了。

我的场景是一个特定的错误服务器实现,但也许它会帮助某人在故障排除时节省时间。

于 2015-02-13T13:57:57.727 回答
1

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

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

您在 Wifi 上是否有同样的问题?

于 2012-06-26T13:03:30.417 回答
0

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

于 2018-05-28T05:35:26.613 回答
0

在我们的例子中,问题出在服务器端(IIS 中的应用程序池配置)。我通过将 Maximum Worker Processes 设置为 1 来解决它。将其设置为大于 1 的值将启用 Web Garden,这似乎是问题所在。

于 2020-02-08T06:10:58.077 回答