1

我想从服务器获取流数据。服务器以格式发送数据multipart/x-mixed-replace,并且具有Connection: close属性。Connection: close意思是,它希望客户端在接收到分块数据时必须关闭连接。我对吗?

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

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

如何随时HttpURLConnection安全关闭?

4

1 回答 1

2

Connection: close意思是,它希望客户端在接收到分块数据时必须关闭连接。我对吗?

不完全是。Connection: closeHTTP 消息中的标头是信息性的,而不是规定性的。它通知接收方服务器打算在发送响应后关闭连接(参见RFC 7230,第 6.1 节)。用户没有义务采取特定行动作为响应,但它可以通过在接收到 HTTP 有效负载后不尝试通过该连接进行任何进一步的通信来节省一些时间。然而,在实践中,是的,客户端在收到响应后,也应该关闭其端的应用层连接,因为在它关闭之前,它会无缘无故地占用相关的系统资源。

但是,如果您使用的是和/或​​从其中获得的,那么这些都不是您真正关心的问题。根据其文档HttpURLConnectionInputStream

每个 HttpURLConnection 实例用于发出单个请求,但到 HTTP 服务器的底层网络连接可能会被其他实例透明地共享。在请求之后调用close()HttpURLConnection 的 InputStream 或 OutputStream 上的方法可能会释放与此实例关联的网络资源,但不会影响任何共享的持久连接。disconnect()如果持续连接当时处于空闲状态,则调用该 方法可能会关闭底层套接字。

即为HttpURLConnection您管理持久连接的详细信息。

你继续,

或者,由于数据流而未关闭连接(服务器每次发送分块数据,我不是每次都向服务器发送获取请求。或者这是在后台完成的?)。

似乎您只是意味着服务器没有指定内容长度,而是在很长一段时间内发送了不确定长度的响应。在这种情况下,Connection标题可能没有太多实际相关性。

因此,在我关闭 inputStream.close() 方法之前,连接不会随时关闭。正确的?

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

此外,如果服务器随时关闭,http url 连接将抛出 IOException。

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

在这种情况下,我必须调用http url连接的disconnect()方法吗?或者,我应该只调用 inputStream.close() 吗?

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

如何随时安全地关闭 http url 连接?

将实例实际连接HttpURLConnection到底层资源后,关闭其流应该足以表明您已完成它。在连接之前,您根本不需要做任何事情。

于 2019-08-11T12:46:14.917 回答