为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中使用非持久连接时,我应该调用 HttpUrlConnection

在 Java 中使用非持久连接时,我应该调用 HttpUrlConnection

长风秋雁 2023-06-04 11:19:36
我想从服务器获取流数据。服务器以一种格式发送数据multipart/x-mixed-replace,它具有Connection: close属性。Connection: close意味着,它希望客户端在接收到分块数据时必须关闭连接。我对吗?或者,连接未关闭,因为数据是流式传输(服务器每次发送分块数据,我不是每次都向服务器发送获取请求。或者这是在后台完成的吗?)。因此,在我调用该方法之前,连接不会随时关闭inputStream.close()。正确的?此外,如果服务器在任何时候关闭,http url 连接将被抛出IOException。在这种情况下,我必须调用disconnect()http url连接的方法吗?或者,我应该打电话给吗inputStream.close()?如何HttpURLConnection随时安全关闭?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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

不完全是。Connection: closeHTTP 消息中的标头是提供信息的,而不是规定性的。它通知接收方服务器打算在发送响应后关闭连接。用户没有义务采取特定的响应行动,但在收到 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实例连接到底层资源,关闭它的流就足以表明您已经完成了它。在连接之前,您根本不需要做任何事情。


查看完整回答
反对 回复 2023-06-04
  • 1 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信