2014-04-07 42 views
3

想象一下真空中的一些球形馬: 我失去了對我的客戶端應用程序的控制,可能發生了一些錯誤。我試圖立即重新進入集線器。 是否有可能,OnConnected啓動速度快,然後OnDisconnected,我打開了兩次在服務器上?重複OnConnected是否有可能在之前的OnDisconnected之前調用?

編輯:

對不起,我沒有說不是我的意思是SignalR庫。我想如果我的應用程序不會調用stop(),服務器默認會等待大約30秒。我可以在OnDisconnected被調用之前再次連接到服務器。不是嗎?

+4

「想象一下真空中的一些球形馬」 - 你失去了我...... –

+1

撇開SignalR,當然不是協議,內部管道是相同的。但是,編輯完成後,您的問題現在有不同的含義。 :/ – mrahhal

+0

當然,我不是指協議堆棧中的協議。抱歉。我會糾正這個問題。 – Neshta

回答

1

客戶端可以在第一次連接打開時連接第二次(它將有一個單獨的連接ID)。

如果客戶端無法通知服務器它正在關閉連接,則服務器將在刪除連接之前等待一段時間(DisconnectTimeout)。 因此,在這種情況下,如果立即重新啓動連接,它將是一個新的連接到服務器的新邏輯連接。

SignalR在丟失時也會嘗試重新連接到現有連接,在這種情況下,一旦重新連接,它將保留其連接ID。我建議閱讀整個article about SignalR connection lifetime events

+0

我已閱讀此文。謝謝。 – Neshta

2

你必須把它從客戶端,也請注意,如果你使用TCP下面會發生:

TCP確保你的數據包將它們發送的順序到達。因此,讓我們假設在同一時刻,「馬」撞上了空間並且連接斷開了,服務器正在發送下一個會檢查連接的數據包(如果您實現的服務器足夠好的話)。

這裏,有可能發生兩件事情:

  1. 客戶已經恢復並可以及時做出反應。意味着連接出現問題的時間間隔足夠小,以至於來自服務器的下一個數據包尚未到達。如此迴應你的問題,首先就沒有斷線。
  2. 服務器的下一個數據包到達但客戶端沒有響應(連接中斷)。服務器會立即注意到這一點,引發了OnDisconnected事件。如果客戶端在服務器記錄的同時虛擬恢復,則它會啓動另一個連接(OnConnected)。

所以客戶不可能轉兩次。如果有的話, 斷開間隔將足夠小,以使服務器不至於首先通知 這個問題。

再次,另一個協議可能會有不同的行爲。但TCP旨在保證服務器和客戶端之間良好的連接和通信。

值得一提的是,許多通信框架(如果不是全部)在默認情況下隱式使用TCP。

+0

它在TCP協議中看起來很棒。那麼SignalR呢? – Neshta

+0

@Neshta我沒有和SignalR ASP.NET一起工作,但我非常肯定它(與所有面向可靠連接的通信一樣)在內部使用TCP。但是,即使不這樣做,我敢肯定創作者實現了類似的東西,可以給你和我在這裏討論的相同的輸出。網絡問題非常普遍,通常在流行的框架中防範這些問題。 – mrahhal

相關問題