在Android中获取“SocketException:对等方重置连接”

Posted

技术标签:

【中文标题】在Android中获取“SocketException:对等方重置连接”【英文标题】:Getting "SocketException : Connection reset by peer" in Android 【发布时间】:2012-06-27 18:35:17 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

阅读这里以获得完整的解释和可能的解决方案:***.com/questions/30538640/… 另见***.com/questions/1434451/… 【参考方案1】:

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

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

不管怎样,现在可以了。


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

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

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

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

【讨论】:

那你是怎么解决的?你能详细说明一下吗?我也遇到了同样的问题。 如文中所述:“在发出任何 HTTP 请求之前,可以通过将 http.keepAlive 系统属性设置为 false 来禁用此行为” @androiddeveloper.. 你对此有什么想法吗***.com/questions/16996820/… @Noman 对不起,不。这个答案是很久以前写的,我什至不记得我做了什么。 我设置了 System.setProperty("http.keepAlive", "false") 但它没有用。你是怎么做到的?【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

在我的例子中,这个错误是由 .NET WCF (soap) 服务引起的。返回结果中的一个对象具有一个具有 get 属性但没有 set 属性的 DataMember。

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

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

【讨论】:

@androiddeveloper :Android 操作系统是客户端,但服务器端可以是任何东西。因此,他的回答可能无法回答 OP,但可以回答其他人。 +1【参考方案4】:

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

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

你在 Wifi 上也有同样的问题吗?

【讨论】:

因为通信是使用同一个设备,我希望与它通信的问题为 0,除非它有非常严重的问题。我认为这与 wifi vs 3g 没有任何关系,但我使用的是 wifi。 我想我误解了这个问题。 i reach a website there with json content,您的意思是您访问了一个由手机上运行的网络服务器托管的网站? 是的,设备既是客户端又是服务器,网页只包含json响应。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于在Android中获取“SocketException:对等方重置连接”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin.Android 中获取指南针方向

在 Android 中获取基站信息

急问!!!Android中如何获取或者定义AttributeSet参数??

如何在 android 应用程序中获取连接的外围设备列表(不是 android 的东西)

Android逆向之旅---Android中如何获取在非Root设备中获取应用隐私数据

我如何在android中获取音频的帧长?