在Android中出现“SocketException:连接被对等方重置”的情况

44

我的应用程序需要通过 http://127.0.0.1/...(本地主机URL)与其所在的设备进行通信。

由于某些原因,大约50%的情况下(可能恰好是50%),当我访问那里的具有JSON内容的网站时,会出现异常:

java.net.SocketException: recvfrom failed: ECONNRESET (连接重置)

对于另外50%,我得到完美的结果。我尝试过轮询(甚至是长时间延迟的轮询),但仍然得到相同奇怪的结果。

我在互联网上和这里都搜索了一下,但不确定为什么会发生这种情况。peer是指客户端引起的吗?它为什么会发生,我该如何处理它?

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


请查看以下链接以获取完整的解释和可能的解决方案:https://dev59.com/Ouo6XIcBkEYKwwoYFQLr?lq=1 - Devendra Vaja
1
请参见https://dev59.com/B3M_5IYBdhLWcg3wThR3。 - Raedwald
6个回答

22

好的,答案是服务器出了问题,它必须在每个请求之后关闭连接。可能是Android保留了一组连接并使用旧连接或类似的东西。

无论如何,现在它能用了。


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

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

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

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


4
那么你是如何解决它的?能否详细说明一下? 我正在遇到同样的问题。 - Yogesh Somani
3
在发出任何HTTP请求之前,将http.keepAlive系统属性设置为false可以禁用此行为。 - android developer
1
@androiddeveloper,你知道这个问题http://stackoverflow.com/questions/16996820/connection-reset-by-peer-java-exception的解决方法吗? - Noman
1
我已经设置了System.setProperty("http.keepAlive", "false"),但它没有起作用。你是怎么做到的? - Lendl Leyba
@Keshav1234 对不起,我不记得这个问题和答案了。 - android developer
显示剩余8条评论

7

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

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

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

3

我知道这是一个旧的帖子,但它可能会对某人有所帮助。

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

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

我的场景是特定的坏服务器实现,但也许它能够帮助一些人节省故障排除时间。


2
@androiddeveloper:Android操作系统是客户端,但服务器端可以是任何东西。因此他的回答可能不能回答OP的问题,但它可能会回答其他人的问题。+1 - Lionel Pire

1
当我访问某些网页或从我的应用程序或Android浏览器下载文件时,我经常遇到“Connection reset by peer”的问题。
结果发现是我的3G运营商阻止了这些连接(例如,禁止下载“.exe”文件)。
你在Wifi上有同样的问题吗?

由于通信是与同一设备进行的,我希望在通信方面不会出现任何问题,除非它真的存在严重问题。我认为这与WiFi和3G无关,但我使用WiFi。 - android developer
我想我误解了这个问题。你所说的“我到达一个带有JSON内容的网站”,是指你到达了由手机上运行的Web服务器托管的网站吗? - Sébastien
是的,该设备既是客户端又是服务器,并且网页仅包含JSON响应。 - android developer

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

0
在我的情况下,问题已经通过清除由运营商生成的APN中的代理地址和端口得到解决。 根据我的测试,使用远程服务器的IP地址而不是域名也可以解决这个问题。

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