在Android中获取“对象重置的SocketException:连接”

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

出于某种原因,当我到达带有JSON内容的网站时,大约有50%的时间(也许恰好是50%),我得到了一个例外:

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

另外50%,我得到了非常好的结果。 我试图做投票(甚至民意调查之间的大拖延),但我一直得到相同的奇怪的结果。

我search了互联网,也在这里,我不知道为什么会发生。 同行是否意味着客户已经造成了这种情况? 为什么会发生,我该如何处理呢?

有些网站说这是一件很平常的事情,但是在这种情况下我没有find最好的办法。

好的,答案是这是服务器的错误 – 每次请求后都必须closures连接。

Android可能会保持一个连接池,并使用旧的或类似的东西。

无论如何,现在它的工作。


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

这个类返回的input和输出stream不被缓冲。 大多数调用者应该使用BufferedInputStream或BufferedOutputStream封装返回的stream。 只进行批量读取或写入的呼叫者可能会省略缓冲。 向服务器传输大量数据或从服务器传输大量数据时,请使用数据stream一次限制内存中的数据量。 除非您需要将整个主体一次存储在内存中,否则将其作为stream进行处理(而不是将整个主体存储为单个字节数组或string)。

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

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

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

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

这将禁用默认情况下打开的“ 保持活动 ”属性。

这是我知道的一个老线索。 但这可能有助于某人。

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

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

我的scenerio是一个特定的错误的服务器实现,但它可能会帮助他人在故障排除时节省时间。

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

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

你有没有同样的问题在无线上?

System.setProperty(“http.keepAlive”,“false”);

在这个链接中,详细描述HTTP连接。 试试这个链接(1498 + ves):

使用java.net.URLConnection来触发和处理HTTP请求

当wificlosures或数据连接被禁用时,这种exception简单地引发,因此App不能连接到服务器。