2011-05-06 88 views
3

我有一個客戶端應用程序的多個實例,通過TcpClient通過互聯網連接到一個主應用程序。 (都由我編碼)。因此,在建立連接,如:中斷後重新連接TCPClient

TcpClient.Connect(IP,端口)

我現在想這個處理各種類型斷開事件:

  1. 主要的應用程序(服務器)或客戶端應用程序電腦失去互聯網連接

    • 在連接時的簡歷,通訊似乎失去了,但是當我嘗試重新連接時,我得到消息:
    • 所以我需要關閉「的連接請求已連接的套接字上做了」並重新啓動客戶端應用。
  2. 主應用程序(服務器)關閉並重新啓動。

    • 重新啓動主應用程序,然後嘗試重新連接客戶端應用程序導致與上述相同的錯誤。

那麼,我需要做什麼?我是否需要在客戶端應用程序中實例化新的TcpClient,只要發生這種中斷?我還沒有嘗試過,所以不知道這是否是一個糟糕的解決方案?

+1

看看我的解決方案:https://github.com/Mellen/Networking-Samples – 2011-05-06 11:17:06

+3

不,不要看那個客戶端的例子。不要使用線程在後臺讀取。使用異步方法。 – jgauffin 2011-05-06 11:32:05

回答

6

我是否需要在客戶端應用程序中實例化一個新的TcpClient,只要發生這種中斷?

是的。如果由TcpClient表示的連接斷開,則不能使用該對象進行進一步通信,也不能再次連接它。創建一個新的TcpClient對象。

你的問題很可能是NAT網關超時你的TCP連接,所以沒有任何東西可以通過你的服務器< - >客戶端,如果你的客戶端所做的是從連接中讀取,它不會發現這種情況,並且它認爲連接仍然是開放的。

+0

謝謝!我打算每隔5秒左右檢查客戶端應用程序的連接。不知道如何,通過發送一個標準的消息,應該給出一定的響應,或者可能有一些方法已經在我可以使用的TcpClient對象上?然後這應該發現任何斷開連接,然後我可以實例化一個新的TcpClient並重新連接。這聽起來合理嗎? – bretddog 2011-05-06 11:50:02

+0

是的。在連接上發送某種心跳,然後等待(超時)以進行回覆 – nos 2011-05-06 13:32:39

1

我以前通常使用線程解決了這個問題。我創建了一個控制線程,循環執行管理事務,檢查連接,檢查最新的用戶輸入,檢查服務器關閉請求等。完成後,它休眠半秒鐘,然後重新完成。

然後,我創建了一個單獨的套接字線程,並且簡單地維護了一個網絡套接字。它會打開連接,一旦啓動並循環反覆查找來自誰連接到的任何傳入消息。如果它發現一條消息,它會處理它並將其存儲在易失性對象集合中供控制線程使用。如果連接發生了什麼事情,它會自動嘗試解決,如果不能,它會進入「死亡」狀態。下一次迭代的控制線程將清理死亡套接字線程並根據需要創建新線程。

調試是一場噩夢,但一旦錯誤得到解決,它就會出人意料地穩定下來。在一個實例中,它成功運行了一年多,數萬個連接和數百個併發連接,無需重新啓動或進行任何維護。

+0

乾杯,我需要在這個工作是的。我也需要這樣的穩定​​性。目前我在流讀取上使用AsyncCallback,所以我想這會使它獨立於它自己的線程。對於連續檢查,我使用一個計時器來觸發事件,這個事件在它自己的線程上運行。但我需要納入更全面的檢查。 – bretddog 2011-05-06 12:18:31

+0

定時器線程和回調線程很好,但是如果你編寫自己的線程,你可能會有更好的控制。這樣做的另一個好處是,我可以將它們打包到客戶端和服務器都有的自己的庫中,以便客戶端可以運行自己的服務器用於調試目的。另外,我確信客戶端和服務器都可以使用常見的例程。 – 2011-05-06 12:39:34