Java中的持久HttpURLConnection
我想写一个Java程序,将自动下载并命名我最喜欢的networking漫画。 由于我将要求从同一个域的多个对象,我想有一个持续的http连接,我可以保持开放,直到所有的漫画已经下载。 以下是我正在进行的工作。 如何在不打开新的http连接的情况下,从同一个域但不同path发出另一个请求?
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); } } }
根据这里的文档 ,HTTP持久化在Java中被透明地处理,虽然它也给你通过http.keepAlive
和http.maxConnections
系统属性来控制它的选项。
然而,
当前的实现不缓冲响应主体。 这意味着应用程序必须完成读取响应主体或调用close()来放弃响应主体的其余部分,以便重用该连接。 而且,当前的实现在清理连接时不会尝试读取块,这意味着如果整个响应体不可用,连接将不会被重用。
看看链接,看看它是否真的帮助你。
默认情况下,如果主机启用了保持活动状态,HttpURLConnection足够聪明,可以重用到同一主机的连接。
但是,error handling很弱,您可能会遇到客户端和主机不同步的情况,并且连接简单地挂起。 因此,我们总是禁用保持活着。
根据这个链接http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html ,默认启用HTTP连接重用,可以使用Wireshark来检查你的客户端和服务器。 第一个请求包含TCP和SSL握手(如果请求是https),随后的请求在保持活动时间中触发,不包含TCP和SSL握手,仅包含应用程序数据传输。