亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號