我正在尝试编写一个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);
}
}
}
答案 0 :(得分:18)
根据documentation here,HTTP持久性正在Java中透明地处理,尽管它通过http.keepAlive
和http.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();
}
}