Java中的持久HttpURLConnection

Git*_*ron 19 java httpurlconnection persistent

我正在尝试编写一个java程序,它将自动下载并命名一些我最喜欢的网络漫画.因为我将从同一个域请求多个对象,所以我希望有一个持久的http连接,我可以保持打开直到所有漫画都已下载.以下是我正在进行的工作.如何在不打开新的http连接的情况下从同一个域但是不同的路径发出另一个请求?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class ComicDownloader
{
    public static void main(String[] args)
    {
        URL url = null;
        HttpURLConnection httpc = null;
        BufferedReader input = null;

        try
        {
            url = new URL("http://www.cad-comic.com/cad/archive/2002");
            httpc = (HttpURLConnection) url.openConnection();
            input = new BufferedReader(new InputStreamReader(httpc.getInputStream()));
            String inputLine;

            while ((inputLine = input.readLine()) != null)
            {
                System.out.println(inputLine);
            }

            input.close();
            httpc.disconnect();
        }
        catch (IOException ex)
        {
            System.out.println(ex);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ycl*_*ian 18

根据此处文档,HTTP持久性正在Java中透明地处理,尽管它为您提供了通过http.keepAlivehttp.maxConnections系统属性来控制它的选项.

然而,

当前实现不会缓冲响应主体.这意味着应用程序必须完成读取响应主体或调用close()以放弃响应主体的其余部分,以便重用该连接.此外,当前实现不会在清理连接时尝试块读取,这意味着如果整个响应主体不可用,则不会重用连接.

看看链接,看看它是否真的对你有帮助.

  • @royerdpack 当然可以。你不能真的相信他们会采取这样一个有价值的功能。 (2认同)
  • 完成阅读*并且*不要在输入流或输出流上调用close()。调用 close() 导致我的客户端代码重新打开 HTTPS 连接。 (2认同)
  • FWIW 我想我读过一次 /sf/answers/333731681/ 调用断开连接(就像 OP 一样)也会导致 Socket 不被重用/缓存...... (2认同)

小智 5

根据这个链接http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html,默认情况下启用 HTTP 连接重用,您可以使用 Wireshark 检查您之间的交互客户端和服务器。第一个请求包含 TCP 和 SSL 握手(如果您的请求是 https),后续请求在保持活动时间内触发,不包含 TCP 和 SSL 握手,仅包含应用程序数据传输。