我正在使用HttpURLConnection来下载Java中的页面。我忘了释放连接,我认为这给我的系统(网络浏览器)带来了一些问题。
现在我已经完成了一些测试,看到在断开连接后,某些连接仍然像Windows上netstat
命令的结果中的TIME_WAIT一样。
如何立即释放此连接?
示例代码:
private HttpURLConnection connection;
boolean openConnection(String url) {
try {
URL urlDownload = new URL(url);
connection = (HttpURLConnection) urlDownload.openConnection();
connection.setInstanceFollowRedirects(true);
connection.connect();
connection.disconnect();
return true;
} catch (Exception e) {
System.out.println(e);
return false;
}
}
答案 0 :(得分:4)
在某些实现中,如果您调用了getInputStream
或getOutputStream
,则需要确保关闭这些流。否则,即使在调用disconnect
后,连接也可以保持打开状态。
编辑:
这是来自J2SE docs的HttpURLConnection [强调添加]:
如果持久连接在那时处于空闲状态,则调用disconnect()方法可能关闭底层套接字。
这来自Android docs:
为了减少延迟,此类可以为多个请求/响应对重用相同的底层Socket。因此,HTTP连接可能会保持打开的时间超过必要的时间。调用disconnect()将套接字返回到已连接套接字池。在发出任何HTTP请求之前,可以通过将“http.keepAlive”系统属性设置为“false”来禁用此行为。 “http.maxConnections”属性可用于控制将保留每个服务器的空闲连接数。
我不知道你正在使用什么平台,但它可能有类似的行为。
答案 1 :(得分:0)
TME_WAIT状态由TCP强加,而不是由Java强加。它持续两分钟。这很正常。