1 回答

TA貢獻1830條經驗 獲得超9個贊
Connection: close
意味著,它希望客戶端在接收到分塊數據時必須關閉連接。我對嗎?
不完全是。Connection: close
HTTP 消息中的標頭是提供信息的,而不是規定性的。它通知接收方服務器打算在發送響應后關閉連接。用戶沒有義務采取特定的響應行動,但在收到 HTTP 負載后不再嘗試通過該連接進行任何進一步的通信可能會節省一些時間。然而,在實踐中,是的,在收到響應后,客戶端也應該關閉其端的應用層連接,因為直到它關閉,它會無緣無故地占用相關的系統資源。
但是,如果您正在使用一個和/或從一個獲得的,那么這些都不是您真正關心的。根據其文檔:HttpURLConnection
InputStream
每個 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
實例連接到底層資源,關閉它的流就足以表明您已經完成了它。在連接之前,您根本不需要做任何事情。
添加回答
舉報