2015-09-04 90 views
0

我試圖做一個套接字連接,以保持活着,以便在連接丟失的情況下。所以基本上我想保持服務器始終打開(最好是客戶端),並在連接丟失後重新啓動客戶端。但如果一端關閉了兩端關閉。我通過將兩端都放在同一臺計算機"localhost"上並單擊X按鈕來模擬此操作。這可能是我的問題的根源嗎?在連接丟失的情況下保持python套接字活着

反正我的連接碼 m.connect(("localhost", 5000)) 處於iftrywhile例如

while True: if tryconnection: #Error handeling try: m.connect(("localhost", 5000)) init = True tryconnection = False except socket.error: init = False tryconnection = True

而在我的代碼的最後我只是一個m.send("example")當我按下一個按鈕,如果返回一個錯誤的嘗試重新連接到"localhost"啓動代碼。而服務器是一個非常通用的服務器設置,在x.accept()周圍有一個while循環。那麼在連接關閉時如何保持它們都處於活動狀態,以便它們在重新打開時可以重新連接。或者,我的代碼是否正常,它只是在同一臺計算機上模擬而已?

+0

TCP無法「保持連接處於活動狀態」 - 所以至少有兩個選項:1.使用無連接的UDP,並且在所有需要的層之上分層以使數據傳輸可靠並且流暢,控制(即複製相當多的TCP堆棧:-o或2)繼續使用TCP,但在其上添加一個層,以便當客戶端重新連接客戶端時,將某些特定於客戶端的信息(令牌/ cookie)提供給服務器允許服務器恢復以前的連接。這是您的瀏覽器可以使用cookie恢復與服務器的Web會話的方式。 – barny

+0

你有沒有我如何添加圖層的例子。我比較新。謝謝 – ferret249

+0

當客戶端連接時,如果客戶端沒有保存,客戶端會自動發送一條消息,說明'這是我過去的令牌'或'沒有令牌'。在服務器上,對於新的TCP連接,等待令牌信息並驗證令牌(例如,服務器是否有記錄?是否不太舊?是否用戶註銷?)並進行適當處理。例如如果客戶端已經註銷,則用戶需要重新進行身份驗證。如果沒有註銷,則最近一次連接是最近的,然後恢復會話。這完全是*網站如何記住用戶並在瀏覽器中使用cookie保留購物籃。 – barny

回答

1

我假設我們在這裏處理TCP,因爲你使用「連接」這個詞。

這一切都取決於你的意思是「連接損失」。

如果出現連接丟失,則意味着服務器和客戶端之間的數據交換可能會暫停/不響應(重要的是:我沒有在這裏說「關閉」)時間長,時間長或分鐘長,你可以做的並不多,因爲TCP協議經過精心設計,可以很好地處理這種情況。決定一方或另一方之前的超時肯定是下降,放棄,並關閉連接是很長的(分鐘)。這種情況的例子:客戶端是你的智能手機,連接到網絡上的某個服務器,然後你進入一個長長的隧道。

但是,當你說:「但是,如果一端關閉兩端關閉我模擬這個由同一臺計算機上本地主機有兩端,只需點擊X按鈕。」,你在做什麼其實是關閉連接。

  • 如果突然終止服務器:在TCP/IP實現操作系統的都知道,有沒有更多的監聽端口5000的過程,將乾淨關閉該端口的所有連接。在這種情況下,客戶端會發生一些TCP段交換(這是TCP 4路拆除或重置),並且所有客戶端都將被拒絕。理解這一點很重要,這是在TCP/IP實現級別完成的,也就是說您的操作系統。

  • 如果突然終止客戶端,因此,您的操作系統的TCP/IP實現將乾淨關閉從它連接的出口Y到你的服務器端口5000

  • 在這兩種情況下/側,在網絡級別,就像您明確(不突然)關閉代碼中的連接一樣。

...一旦封閉,有沒有辦法你都不可能,因爲他們之前重新建立這些連接。你必須建立新的聯繫。

如果你想建立這些新的連接並獲得應用程序邏輯到之前的狀態,那麼現在就是另一個話題了。單憑TCP無法幫助你。您需要更高級別的協議,或許您自己的協議來實現有狀態的客戶端/服務器應用程序。

0

該問題與編程語言無關,在本例中爲python。操作系統(Windows或Linux)對套接字的恢復程度有最後的評價。