2012-05-10 3 views
0

У меня возникают проблемы с этой частью кода. На самом деле я хочу установить приложение Client/Server. В клиентской части я запускаю Thread, функция которой проверяется только каждый раз, если она подключена к серверу (если соединение с сервером все еще установлено) TraceLog - это класс, который использует свой метод Info() для записи в файл. это является код клиента:C# Соединение с клиентом/сервером Thread

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 
using System.IO; 

namespace ClientApp 
{ 
    class ClientOpenConnection 
    { 
     private static Thread threadConnect; 
     static TcpClient myClient = new TcpClient(); 
     static String host = ""; 
     static Int32 port = 0; 

     //Function that makes the client runs 
     public static void RunClient(String hostname, Int32 hostport) 
     { 
      host = hostname; 
      port = hostport; 
      int _tryAgain = 0; 

      while (!myClient.Connected) { 
       try 
       { //I start the connection 
        myClient.Connect(host, port); 
       } 
       catch { 

       } 
       _tryAgain += 10; 
       if (_tryAgain == 1000) 
        break; 
       //_tryAgain allows me to define how long will the client try to connect to the server. 
      } 
      TraceLog.Info("Out of the while ", ""); // This is to know where am I 

      if (_tryAgain != 1000) 
      { //If I get out because _tryAgain is less than 1000. It means that I am already connected to the server 
       //Here I start a Thread to be sure that I am always connected to the server 
       threadConnect = new Thread(isConnected); 
       threadConnect.Start(); 
       TraceLog.Info("Launch the thread",""); 
      } 
      //While threadConnect is executing parallely I continue my program 
     } 

     private static void isConnected() { 
      //I keep my eyes on the network connection 
      while (myClient.Connected) { 
       //Nothing is done 
      } 
      TraceLog.Info("The connection has been lost",""); 
      RunClient(host,port); 
     } 
    } 
} 

Проблема, которую я имею, когда я начинаю клиента до сервера я ввожу первый цикл WHILE. это нормально на этом уровне. , и когда я запускаю сервер после, я запускаю threadConnect, но проблема в том, что если теперь я остановлю сервер, обычно я должен иметь внутри файла журнала «Соединение было потеряно», но у меня ничего нет. Что не так с этой частью кода? Вы уже делали что-то подобное в прошлом?

Я пришел с модификацией, но все еще имею проблему для получения того, что хочу, т.е. клиент все еще пытается связаться с сервером eveytime, даже если сервер остановлен.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 
using System.Net; 
using System.Threading; 
using System.IO; 

namespace ClientApp 
{ 
    class ClientOpenConnection 
    { 
     private static Thread threadConnect; 
     static TcpClient myClient = new TcpClient(); 
     static String host = ""; 
     static Int32 port = 0; 

     //Function that makes the client runs 
     public static void RunClient(String hostname, Int32 hostport) 
     { 
      host = hostname; 
      port = hostport; 

      TraceLog.Info(" -> "+myClient.Connected,""); 

      while (!myClient.Connected) { 
       try 
       { 
        myClient.Connect(host, port); 
        TraceLog.Info(" <-> " + myClient.Connected, ""); 
       } 
       catch { 
        TraceLog.Info("Trying to contact the server",""); 
       } 
      } 
      TraceLog.Info("I am connected ", ""); 

      //Here I start a Thread to be sure that I am always connected to the server 
      threadConnect = new Thread(isConnected); 
      threadConnect.Start(); 
      TraceLog.Info("Launch the thread to be sure I am constantly online",""); 
     } 

     private static void isConnected() { 
      //I keep my eyes on the network connection 
      TraceLog.Info("->>"+myClient.Connected,""); 
      while (myClient.Connected) { 

       Thread.Sleep(500); 

       try 
       { 
        NetworkStream stream = myClient.GetStream(); 

        ASCIIEncoding ascii = new ASCIIEncoding(); 

        byte[] _incomingMsg = new byte[1024]; 

        stream.Read(_incomingMsg, 0, _incomingMsg.Length); 

        String strToGet = System.Text.Encoding.ASCII.GetString(_incomingMsg); 

        strToGet = strToGet.Trim(); 

        if (!strToGet.Equals("ONLINE")) 
         if (strToGet.Equals("")) 
         { 
          TraceLog.Info("The message receive is empty",""); 
          break; 
         } 
       } 
       catch { 
        break; 
       } 
      }   
      TraceLog.Info("The connection has been lost", ""); 
      RunClient(host, port); 
     } 
    } 
} 

Но когда я называю RunClient() в IsConnected() функцию он выполняет в WHILE и выходе TraceLog.Info ("Попытка связаться с сервером", "");, даже если я снова запустил сервер, клиент остается в цикле while и никогда не подключается вообще.

+0

в то время как (myClient.Connected) { // Ничего не делается } в этом коде не вставить Thead.Sleep (0) или больше - это нить работает Удерживание и никогда не выйти из – ctescu

+0

время преобразования в то время (myclient.Connected) {Thread.Sleep (0);} – ctescu

ответ

2

От MSDN:

Подключенного свойство получает состояние подключения клиентского сокета в последней операции ввода/вывода. Когда он возвращает false, клиентский сокет либо никогда не был подключен, либо больше не подключен.

Поскольку свойство Connected отражает только состояние соединения по состоянию на самую последнюю операцию, вы должны попытаться отправить или получить сообщение, чтобы определить текущее состояние. После того, как сообщение отправлено с ошибкой, это свойство больше не возвращает true. Обратите внимание, что это поведение по дизайну. Вы не можете надежно проверить состояние соединения , потому что в промежутке между тестом и отправкой/получением соединение могло быть потеряно. Ваш код должен предположить, что сокет подключен и изящно обрабатывает неудачные передачи.

Другими словами, чтобы проверить, все ли вы подключены, вам необходимо отправить или получить некоторые данные, а затем проверить состояние соединения.

Поскольку ваш код не отправляет никаких пакетов после установления соединения, связанное свойство всегда возвращает true, и цикл никогда не выходит.

+0

Привет @MSDN, я изменил метод isConnected(), но я не знаю, как проверить, было ли отправлено мое сообщение или нет. {String strToSend = "Hello server"; NetworkStream stream = myClient.GetStream(); ASCIIEncoding ascii = new ASCIIEncoding(); byte [] byteToSend = ascii.GetBytes (strToSend); stream.Write (byteToSend, 0, byteToSend.Length);} – DeathCoder