Java HttpURLConnection和pooling

在阅读了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. 是否需要刷新和关闭以使底层套接字可重用?

  2. connection.disconnect()关闭底层套接字(从而使其无法使用)吗? keep-alive会影响这种行为吗?

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

  4. 什么时候汇集连接会被破坏?

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

此外,如果您还可以将Android版本与Java进行比较,那将会非常棒。

谢谢

  1. 是否需要刷新和关闭以使底层套接字可重用?

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

  1. connection.disconnect()关闭底层套接字(从而使其无法使用)吗?

它可以作为关闭底层连接的暗示。

keep-alive会影响这种行为吗?

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

  1. 如果我使用不同的URL对象,但使用相同的URL,那么从它们创建的connection是否会共享底层套接字?

是。

如果URL的主机部分相同但路径不同,该怎么办?

是。

  1. 什么时候汇集连接会被破坏?

空闲超时后。

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

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

此外,如果您还可以将Android版本与Java进行比较,那将会非常棒。

我相信Android根本不会集合,但是当它们切换到OpenJDK源时应该会改变。