在Android中获取"SocketException:Connection by peer reset"

and*_*per 39 android localhost socketexception peer

我的应用程序需要通过http://127.0.0.1/...(localhost url)联系它正在处理的同一设备.

出于某种原因,当我到达那里有JSON内容的网站时,大约50%的时间(可能正好是50%),我得到例外:

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

对于其他50%,我得到了非常好的结果.我试图进行民意调查(甚至民意调查之间的延迟很大),但我仍然得到同样奇怪的结果.

我搜索过互联网,也在这里,我不确定为什么会这样.对等方是否意味着客户端已经造成了这种情况?为什么会这样,我该如何处理?

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

and*_*per 21

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

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

无论如何,现在它的工作原理.


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

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

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

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

  • 那你是怎么解决的?你能详细说明吗?我遇到了同样的问题. (4认同)
  • 正如文中所写:"在发出任何HTTP请求之前,可以通过将http.keepAlive系统属性设置为false来禁用此行为" (3认同)

val*_*dak 6

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

conn.setRequestProperty("connection", "close");
Run Code Online (Sandbox Code Playgroud)

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