Java 中的持久 HttpURLConnection

问题描述 投票:0回答:3

我正在尝试编写一个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);
        }
    }
}
java httpurlconnection persistent
3个回答
20
投票

根据此处的文档,HTTP 持久性在 Java 中是透明处理的,尽管它也为您提供了通过

http.keepAlive
http.maxConnections
系统属性来控制它的选项。

但是,

当前的实现并没有 缓冲响应正文。意思是 申请必须完成 读取响应正文或调用 close() 放弃其余部分 响应体,以便 连接被重用。此外, 当前的实现不会尝试 清理时块读取 连接,意味着如果整个 响应主体不可用, 连接将不会被重复使用。

查看链接,看看它是否真的对您有帮助。


5
投票

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


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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.