在 Java 中使用非持久连接时,我应该调用 HttpUrlConnection 的 disconnect() 方法吗?

Should I call disconnect() method of HttpUrlConnection when using non persistent connections in Java?

我想从服务器获取流式数据。服务器以 [​​=11=] 格式发送数据,它有 Connection: close 属性。 Connection: close 的意思是,它希望客户端在收到分块数据时必须关闭连接。我说得对吗?

或者,连接未关闭,因为数据正在流式传输(服务器每次发送分块数据,我不是每次都向服务器发送获取请求。或者这是在后台完成的?)。因此,在我调用 inputStream.close() 方法之前,连接不会随时关闭。对吗?

此外,如果服务器在任何时候关闭,http url 连接将被抛出 IOException。在这种情况下,我必须调用 http url 连接的 disconnect() 方法吗?或者,我应该只调用 inputStream.close() 吗?

如何随时安全地关闭HttpURLConnection

Connection: close means, it wants that client must be close the connection when receive the chunked data. Am I right?

不完全是。 HTTP 消息中的 Connection: close header 是信息性的,而不是规定性的。它通知接收方服务器 打算在发送响应后关闭连接(参见RFC 7230, section 6.1)。用户没有义务采取特定的响应行动,但在收到 HTTP 负载后不再尝​​试通过该连接进行任何进一步的通信可能会节省一些时间。然而,在实践中,是的,在收到响应后,客户端 应该 关闭其端的 application-layer 连接,因为直到它关闭,它将占用关联的系统无缘无故的资源。

但是 none 如果您正在使用 HttpURLConnection 和/或从一。每 its documentation:

Each HttpURLConnection instance is used to make a single request but the underlying network connection to the HTTP server may be transparently shared by other instances. Calling the close() methods on the InputStream or OutputStream of an HttpURLConnection after a request may free network resources associated with this instance but has no effect on any shared persistent connection. Calling the disconnect() method may close the underlying socket if a persistent connection is otherwise idle at that time.

也就是说,HttpURLConnection 为您管理持久连接的详细信息。

你继续,

Or, connection not closed because of data is streaming(server sends chunked data each time, I'm not send get request to the server at each time. Or is this done in the background?).

看来你只是简单的意思是服务器没有指定content-length,并且在一个延长的时间段内发送一个不确定长度的响应。在那种情况下,Connection header 可能没有太多实际意义。

So, connection is not closing at any time until I close the inputStream.close() method. Right?

服务器在发送完完整的响应之前通常不会在其末端关闭连接。如果原则上响应的长度是无限的,那么除了服务器关闭或故障之外,没有理由期望服务器从其端发起连接关闭。

Also, if server is down at any time, http url connection will be thrown the IOException.

也许吧。如果首先尝试建立连接失败,那么您可以期待某种形式的 IOException。如果服务器在传递响应时出现故障,那么您可能会遇到异常,但您也可能只看到流的结尾。

In this case, Must I call the disconnect() method of the http url connection? Or, should I call just inputStream.close()?

您永远不需要 disconnect(),如果您这样做,那只是建议,如上面引用的文档中所述。如果您到达流的末尾,那么您确实应该关闭它。如果在读取流时抛出 IOException,那么最好尝试 close() 流,但也要做好失败的准备,因为流可能处于不一致状态。

How can I close the http url connection safely at any time?

一旦您实际将 HttpURLConnection 实例连接到基础资源,关闭它的流就足以表明您已经完成了它。在连接之前,您根本不需要做任何事情。