2016-12-15 109 views
1

下面是我對TCP服務器端的代碼。問題是當客戶機上的應用程序關閉時,服務器無法自動嘗試每2秒重新連接,直到連接。我怎樣才能做到這一點?如何使TCP服務器自動重新連接到客戶端? C#

我的想法是連接到客戶端後,服務器創建一個狀態線程,每隔30秒向該客戶端發送一個字節,如果失敗--->終止連接並重試再次連接。我不確定它是否會工作。

public static TcpClient client = new TcpClient(); 
public static int port = 6446; 
public static string connectTo = "192.168.0.11"; 
public static NetworkStream dataStream; 


static void Main(string[] args) 
{ 
    int retry = 0; 

TryingConnect: 
    try 
    { 
     do 
     { 
      if (retry == 10) 
      { 
       retry = 0; 
       Console.Clear(); 
      } 
      cout("Connecting..."); 
      IPAddress ipAddress = IPAddress.Parse(connectTo); 
      client.Connect(ipAddress, port); 
     } while (client.Connected != true); 

     cout("Connected!"); 
     dataStream = client.GetStream(); 
    } 
    catch (Exception ex) 
    { 
     // Debug: MessageBox.Show(ex.ToString()); 
     retry++; 
     Thread.Sleep(2000); 
     goto TryingConnect; 
    } 
} 
+0

很確定你不能......這就是爲什麼它被稱爲_server_ – MickyD

回答

1

服務器是監聽來自客戶端的連接的通信方。客戶端是啓動連接的客戶端。如果您希望服務器重新創建與客戶端的丟失連接,則在此情況下,服務器實際上將成爲客戶端,因爲它啓動了新的連接。

除了的詞的含義客戶服務器:如果對等端C喜歡s到連接到它c必須先聽和接受傳入的連接,這是不針對常見的客戶端的情況。即使C會這樣做,C的網絡實際上也必須能被S訪問以創建一個新的連接。這通常不是這種情況,即如果C位於某個本地網絡(典型設置在家中,工作並且經常在移動電話上),則C不能被S訪問,而C本身可能達到S.因此S無法建立連接回到C.

+0

謝謝你的詳細答案。是否有可能檢查連接是否還活着?如果不是,則拋出異常以跳轉到開頭,創建一個新的TCP客戶端對象以連接到特定的IP地址? –

+0

@LouisTran:你的意思是如果客戶端可以在不傳輸應用程序數據的情況下檢查連接是否存活?嘗試使用[TCP keep alive](http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html)或實施一些應用程序層心跳。 –