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
尝试在连接之前为HttpURLConnection设置此属性:
conn.setRequestProperty("connection", "close");
Run Code Online (Sandbox Code Playgroud)
这将禁用默认启用的" keep-alive "属性.
| 归档时间: |
|
| 查看次数: |
82301 次 |
| 最近记录: |