2016-12-15 2 views
1

Ниже приведен мой код для сервера TCP. Проблема в том, что приложение на клиентском компьютере закрывается, сервер не может автоматически пытаться повторно подключаться каждые 2 секунды до момента подключения. Как я могу это достичь?Как я могу заставить TCP-сервер автоматически подключаться к клиенту? C#

Моя идея после подключения к клиенту, сервер создает поток состояния для отправки байта этому клиенту каждые 30 секунд, если fail ---> завершить соединение и повторить попытку для подключения снова. Я не уверен, что он сработает.

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) или выполните несколько шагов на уровне прикладного уровня. –