【问题标题】:In Java, how close the connection and free the port/socket using HttpURLConnection?在 Java 中,如何使用 HttpURLConnection 关闭连接并释放端口/套接字?
【发布时间】:2011-05-29 03:22:20
【问题描述】:

我正在使用 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;
    }
}

【问题讨论】:

    标签: java httpurlconnection


    【解决方案1】:

    在某些实现中,如果您调用了getInputStreamgetOutputStream,则需要确保这些流已关闭。否则,即使在调用disconnect 之后,连接仍会保持打开状态。

    编辑:

    这是来自 J2SE docs 的 HttpURLConnection [强调添加]:

    如果持久连接当时处于空闲状态,则调用 disconnect() 方法可能关闭底层套接字。

    这是来自Android docs

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

    我不知道您使用的是什么平台,但它可能有类似的行为。

    【讨论】:

    • 直接到 InputStream 或文档中的类似内容到 BufferedInputStream 有什么区别?
    • BufferedInputStream 在内存中缓冲块。只要您以通常的方式关闭它,就可以注意到与您遇到的问题相关的问题。做System.setProperty("http.keepAlive", "false")应该这样做。
    • BufferedInputStream 从套接字批量读取到缓冲区,然后以您请求的任何大小的块将内容交付给您。从 InputStream 中为套接字连接读取少量数据是非常低效的。但是,如果您只是自己进行批量读取,则不需要 BufferedInputStream。
    【解决方案2】:

    TME_WAIT 状态是由 TCP 而不是 Java 强加的。持续两分钟。这是正常的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2014-04-28
      • 2013-02-17
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      相关资源
      最近更新 更多