java创建HTTP持久连接
Posted
技术标签:
【中文标题】java创建HTTP持久连接【英文标题】:java create HTTP persistent connection 【发布时间】:2012-05-11 11:20:39 【问题描述】:我正在尝试编写一个 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);
【问题讨论】:
【参考方案1】:只要 HTTP 服务器支持 keep-alive,HttpURLConnection 的实现就会缓存底层 TCP 连接并为您透明地执行此操作。
【讨论】:
谢谢,不知道更多细节可以找到here【参考方案2】:对 HTTP keep-Alive 的支持是透明的。但是,它可以通过系统属性 http.keepAlive 和 http.maxConnections 以及 HTTP/1.1 指定的请求和响应标头来控制。
控制 Keep-Alive 行为的系统属性有:
http.keepAlive=(boolean) 默认:true
指示是否应支持保持活动(持久)连接。
http.maxConnections=(int) 默认值:5
表示每个目标在任何给定时间保持活动的最大连接数
取自:Persistent Connections
【讨论】:
【参考方案3】:HTTP 连接是无状态的,因此您请求的每个新图像都将是一个新 URL,因此也是一个新连接。
【讨论】:
有没有其他方法可以做到这一点,也许没有 HTTP 连接? 你为什么回避创建连接?因为 http 协议就是这样设计的,所以没有开销。 Non sequitur. Java 将在底层执行连接池。 HTTP 请求和连接之间没有 1::1 的联系。 HTTP 1.1 的一部分致力于打破这种联系。前一段时间。当然,创建连接也会产生开销。【参考方案4】:要使用 java 持久 Http 连接,您不应关闭 HttpURLConnection
(在您的情况下为 httpc),而只需关闭输入流,就像从流中读取所有数据或关闭它一样。 Java 会清除 Socket 连接并使其可供重用。
根据 jdk,它使用缓存机制来重用相同的 TCP 连接。调用disconnect()
不应暗示此HttpURLConnection
实例可用于其他请求。
【讨论】:
以上是关于java创建HTTP持久连接的主要内容,如果未能解决你的问题,请参考以下文章
面试题:每发送一个http请求就要建立一个tcp连接吗(非持久连接/持久连接)