20

我正在尝试编写一个 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);
        }
    }
}
4

3 回答 3

20

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

然而,

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

看看这个链接,看看它是否真的对你有帮助。

于 2010-07-21T21:40:27.857 回答
5

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

于 2017-02-16T03:28:01.373 回答
0

即使 HttpURLConnection 默认启用 keep-alive,也不能保证 HttpURLConnection 对多个 HTTP 请求使用相同的 TCP 连接。在编写 HTTPS 客户端应用程序时,我遇到了同样的问题。通过使用 SSLContext、SSLSocketFactory 和 HttpsURLConnection 的单个实例解决了这个问题。

public class MyHTTPClient {
    private SSLContext mSSLContext = null;
    private SSLSocketFactory mSSLSocketFactory = null;
    private HttpsURLConnection mConnection = null;

    public void init() {
        //Setup SSL context and Socket factory here
    }

    pubblic void sendRequest() {
        URL url = new URL("https://example.com/request_receiver");
        mConnection = (HttpsURLConnection) url.openConnection();
        mConnection.setSSLSocketFactory(mSSLSocketFactory);

        // Setup request property and send request
        // Open input stream to read response
        // Close output, input streams
        
        mConnection.disconnect();
    }
}
于 2021-03-12T12:32:25.870 回答