![](/img/trans.png)
[英]What happens when client closes connection before server is done reading bytes from BufferedInputStream?
[英]what happens at the server when client closes the connection by using readTimeout
當客戶端通過使用readTimeout關閉與API的連接時,服務器上會發生什么。請求的執行將完成,否則一旦發生超時就會中斷或執行將完成,響應流被響應服務器阻塞應該發送給用戶
超時是一種不整齊的方式來關閉連接 - 當你的一方連接超時時,很有可能你無法告訴對方你已經超時並正在關閉連接。 也就是說,雙方的協調行動沒有正式結束這種聯系,只是一方決定將其視為死亡。
解決這個問題的方法是在連接的兩端都有超時 - 如果一方超時,另一方也會超時,最終。
至於服務器端究竟發生了什么:由於服務器不知道連接在其自身超時到期之前已經死亡,因此它會認為連接正常,並且通常會處理請求並嘗試寫入響應。 可能會有一些緩沖響應,因此嘗試編寫響應甚至可能對服務器起作用。
當服務器嘗試向響應寫入足夠的數據以填充可能的緩沖區時,它將阻塞,然后當超時發生時,將拋出異常,最后讓服務器知道連接超時。
如果服務器沒有用其響應填充緩沖區,則在嘗試關閉連接時應該發生相同的(阻塞,然后異常)(但這可能已經發生在應用程序之外,在應用服務器容器代碼中)。
如果你有可能在超時已經發生后最終嘗試寫響應,你應該立即得到一個例外。
那么在服務器上究竟發生了什么在很大程度上取決於您自己
無論哪種方式,服務器最終都會知道發生的超時,但我不確定您的應用程序是否始終會獲取此信息。
當客戶端使用readTimeout關閉與API的連接時,服務器上會發生什么。
與客戶因任何其他原因關閉時發生的情況相同。 服務器將繼續執行請求,將成功寫入響應的第一部分,並在寫入其余部分時可能會出現“連接重置”錯誤,如果有休息,並且取決於時間和響應的時間等。
是否將執行請求的執行
是。
或者一旦超時發生就會中斷
沒有。
或者執行將完成
是。
並且響應流被服務器應該發送給用戶的響應阻塞
是的,但這最終會導致服務器上的“連接重置”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.