Java中的持久HttpURLConnection

时间:2010-07-21 21:28:06

标签: 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);
        }
    }
}

3 个答案:

答案 0 :(得分:18)

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

然而,

  

目前的实施没有   缓冲响应体。意思是   应用程序必须完成   阅读回复正文或致电   close()放弃剩下的   响应机构,为此   要重用的连接。此外,   目前的实施不会尝试   清理时的块读取   连接,意思是整体   响应机构不可用了   连接不会被重用。

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

答案 1 :(得分:4)

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

答案 2 :(得分: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();
    }
}