2013-03-29 133 views
-1

服務器如何知道客戶端連接丟失?這會觸發一個事件嗎?是否有可能存儲代碼(服務器端),以便它可以在連接丟失發生之前執行?檢測服務器和客戶端之間的連接丟失

這方面的損失可能發生,如果:

  • 太長時間被閒置。
  • 客戶端端接。

這個我要求特別JSP和PHP。

+1

一般情況下?用特定的語言?特定類型的服務器和連接?請提供更多細節。 – deceze

回答

3

這取決於您所談論的協議,但「連接」通常是通過三方握手建立的,這會導致雙方都簡單地認同他們現在「已連接」。這意味着雙方都記得在表格中存在與IP a.b.c.d的端口x的開放連接以及該「連接」與什麼上下文相關聯。然後,來自該「連接」的所有傳入數據將傳遞給關聯的上下文。

就是這樣,沒有真正的「物理」連接;這只是雙方達成一致的狀態。

根據協議,連接可以通過正確的數據包正式終止。一方將此數據包發送給另一方,告訴它「連接」已終止;雙方都刪除表格條目,就是這樣。

如果在沒有發送這個數據包的情況下連接中斷,雙方都不會知道它。只有下一次一方試圖將數據發送給另一方時,這個問題纔會變得明顯。

根據協議,如果在一段時間內沒有收到數據,連接可能會自動被視爲過期並終止。在這種情況下,死亡連接會很快被注意到,但是需要在雙方之間不斷來回。

所以簡而言之:是的,有一個服務器事件可以觸發,但不保證被觸發。

+0

如果我使用php作爲服務器語言,我可以捕獲該事件嗎?或者服務器的性質在這個過程中有所不同? –

+0

你爲PHP服務器創建了什麼樣的連接? 99%的PHP腳本回答HTTP請求,這是非常短暫的連接。 – deceze

+0

其會話爲基礎。我想要實現的是檢測此類事件(如果存在),在客戶端終止之前獲取觸發器。可以說我想破壞客戶端終止會話。 –

2

當您關閉套接字時,會通知另一端的套接字。但是,如果連接丟失不正常(例如拔下網線或計算機斷電),那麼您可能無法找到。

要解決這個問題,您可以發送週期性消息來檢查連接。如果發送失敗,則連接中斷。儘管如此,確保你的套接字只需等待一段合理的時間。

0

如果您在談論典型的客戶端服務器體系結構,服務器不應該打擾與客戶端的連接。只有客戶端應該打擾與服務器的連接。客戶端應採取措施避免連接丟失,如定期發送保持活動消息或類似消息以避免超時。

0

爲什麼服務器需要打擾連接丟失/終止。

服務器作業是服務來自客戶端的請求。而已。如果客戶端沒有收到它期望從服務器獲得的數據,那麼它可以採取適當的措施。如果服務器正在做一些處理以將數據提供給客戶端,則連接斷開連接;那麼服務器也不能做太多的事情,因爲http請求是由客戶端發起的。

因此,如果客戶端由於某種原因沒有得到響應,可以發出新的請求。

相關問題