2008-09-26 106 views
7

我正在用Java編寫一個Web服務器,我希望它支持HTTP 1.1 Keep-Alive連接。但是,如何知道客戶端何時完成了給定連接的請求? (就像是一個雙線結束的東西)。如何知道何時關閉HTTP 1.1保持連接?

讓我們來看看stackoverflow如何處理這個非常模糊的問題 - 在Google上,這些問題都被技術規範和模糊語言所困擾。我想要一個非C程序員的簡單英語答案:)


我明白了。這證實了我不得不依賴SocketTimeoutException的懷疑。但我不確定是否有一些我可以從客戶端獲得的信息表明它已完成連接 - 這可以讓我在大多數情況下更快地關閉連接 - 而不是等待超時。謝謝

回答

8

如果您正在構建符合標準的服務器,那麼您已經有很多信息來指導您。

簡單口語,它應該基於使用連接的時間,而不是在請求數據級別。

在一個較長的長篇大論方式,HTTP的practical considerations section/1.1的文檔對你有一些指導:

「的服務器通常會有一些 超時值超出他們將 不再保持非活動 連接。代理服務器可能會使 這更高的價值,因爲它很可能 客戶端將通過同一個服務器進行更 連接。 的持續連接 地方沒有要求在 的長度 (或存在),這個超時爲 客戶端或服務器。「

「當一個客戶端或服務器希望 超時它應該發出優美 關閉傳輸連接上。 客戶端和服務器應該都在 時刻關注 的另一端運輸關閉,並在適當的時候迴應 。如果客戶端或服務器 沒有檢測到對方的親密 及時可能會導致網絡上的不必要的 資源流失「

1

你隨時都可以關閉它。標題表示客戶希望您斷開連接,但不要求服務器遵守。大多數服務器將其打開約5-10秒,有些根本不關注它。

1

您應該閱讀處理Keep-Alive功能的RFC。否則,您最終可能會遇到無法正常工作的服務器。作爲@ [Stephen]已經指出,服務器可以隨時關閉連接,只要它希望(好吧,不在請求/響應對中間)。同上給客戶。任何其他解決方案都將允許服務器或客戶端在另一方執行DoS。

編輯:看看連接標題。客戶端(和服務器)可以使用標頭請求正常的連接關閉。例如,Connection: close裏面的請求是服務器發送響應後關閉連接的請求。

+0

我想問的原因是,大多數Web瀏覽器(特別是所有我曾與測試者)的持續發出「連接:保持活動」頭即使在所有的的CSS/.js文件/ etc文件已經請求並收到。我想也許他們比我更聰明,我錯過了一些東西。 – Bret 2008-09-26 17:56:04

+0

瀏覽器更願意保持連接的打開狀態,因爲如果需要向同一臺服務器發送更多請求,則會增加響應時間。沒有什麼能夠防止服務器在每次請求後忽略Keep-Alive功能並關閉連接。 – Alexander 2008-09-26 18:06:03

3

讓我們來看看計算器如何處理這個非常模糊的問題 - 答案爲此,在谷歌,深陷在技術規格和晦澀的語言。

我只是把When should I close an HTTP 1.1 connection?到谷歌和三分命中爲HTTP真的變得容易。在內容表中,有一個名爲Persistent Connections and the "Connection: close" Header部分中的鏈接。 這個 部分長三段,使用非常簡單的語言,並告訴你到底你想知道什麼。

我想對於非C程序員的純英語答案:)

恕我直言,編程是一個技術性的努力,其中的細節問題很大。閱讀技術文檔是絕對必要的技能。依靠「簡單英語」對規範的第三方解釋只會導致你做得不好。

相關問題