2016-02-04 60 views
1

在阅读了关于Java HttpURLConnection的各种文档之后,我仍然很困惑它是什么类型的池以及它如何连接。Java HttpURLConnection和池

例如,下面的代码

URL url = new URL(someUrl); 
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
OutputStream os = connection.getOutputStream(); 
InputStream is = connection.getInputStream(); 

/** Write something to os and flush */ 
/** Read from is */ 

os.close(); 
is.close(); 
connection.disconnect(); 
  1. 做既osis需要被刷新,关闭底层套接字是可重复使用的?

  2. connection.disconnect()关闭底层套接字(并因此使其不可用)? keep-alive会影响这种行为吗?

  3. 如果我使用不同的URL对象,但使用相同的URL,那么从它们创建的connection是否共享底层套接字?怎么样当URL的主机部分是相同的,但路径不同?

  4. 什么时候会将连接的连接销毁?

  5. 什么是控制池大小的系统属性?

此外,如果您还可以比较Android版本和Java,那就太棒了。

感谢

回答

5
  1. 一举两得osis需要被刷新,关闭底层套接字是可重复使用的?

关闭输入流就足够了。您无法刷新输入流,并且在关闭之前刷新输出流是多余的。

  • connection.disconnect()关闭基础插座(并且因此使其不可再)?
  • 它'作为提示'来关闭底层连接。

    keep-alive是否会影响此行为?

    是的。如果不存在,则必须关闭连接。

  • 如果使用不同的URL对象,但具有相同的URL,将他们创建的connection一同分享底层插座?
  • 是的。

    当URL的主机部分相同但路径不同时如何?

    是的。

    1. 什么时候合并连接被销毁?

    空闲超时后。

    1. 什么是控制池大小的系统属性?

    我不知道,有一个,但如果它会在网络属性页面,您可以通过找到的Javadoc定义。

    此外,如果您还可以比较Android版本和Java,那就太好了。

    我相信Android根本就没有进行池化,但是当它们切换到OpenJDK源代码时,它应该会改变。

    +1

    关于第一点,我做了两个测试,每个测试有10个请求。在第一次测试中,我使用getContent获得了InputStream并关闭了它。在第二次测试中,我也在关闭之前阅读整个流。结果对于每一轮中的第二个请求都是不同的:当我关闭InputStream时,其他8个请求(第一个是800ms,第二个是600,其余的是140ms)相当慢,当时我也只读了响应第一次花了800,其余花了140ms。不知道为什么会这样。使用JDK 1.8.0_51。 –

    +1

    看起来观察到的行为与JDK 1.6中引入的http.KeepAlive.remainingData有关。 http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.html –

    +0

    你碰巧有你的观点文件吗? –