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.keepAlivehttp.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连接吗(非持久连接/持久连接)

Java 维护一个持久的 TCP 连接

HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接

JAVA中socket的TCP连接个数

没有HTTP连接池,空谈什么持久连接

【小白学爬虫笔记】持久连接、非持久连接