我的应用需要通过http://127.0.0.1/...
(本地主机网址)联系其正在使用的设备。
出于某种原因,当我到达那里有JSON内容的网站时,大约有50%的时间(可能正好是50%),我得到了例外:
java.net.SocketException:recvfrom failed:ECONNRESET(由对等方重置连接)
对于其他50%,我获得了非常好的结果。我试图进行民意调查(甚至民意调查之间的延迟很大),但我仍然得到同样奇怪的结果。
我搜索了互联网,也在这里,我不确定为什么会这样。对等方是否意味着客户端已经造成了这种情况?为什么会这样,我该如何处理?
有些网站说这是常见的事情,但我没有找到在这种情况下最好的事情。
答案 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,这似乎是个问题。