2017-04-20 5 views
0

J'utilise des sockets pour la connexion TCP-IP et je voudrais établir un simple système send-receive du côté client.C# socket client multiple envoyer et recevoir

Socket sck; 
     sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     IPEndPoint localEndpt = new IPEndPoint(IPAddress.Parse("123.123.123.1"), 12345); 
     try 
     { 
      sck.Connect(localEndpt); 
     } 
     catch 
     { 
      Console.Write("Unable to Connect"); 
     } 
     while (true) 
     { 
      Console.WriteLine("Enter Text"); 
      string sendtext = Console.ReadLine(); 
      byte[] Data = Encoding.ASCII.GetBytes(sendtext); 
      sck.Send(Data); 
      Console.WriteLine("Data Sent!"); 

      byte[] bytesReceived = new byte[sck.ReceiveBufferSize]; 
      int bytes = 0; 
      String strReceived = ""; 

      int dataAvailable = 0; 
      while (dataAvailable == 0 || dataAvailable != sck.Available) 
      { 
       dataAvailable = sck.Available; 
       Thread.Sleep(100); // if no new data after 100ms assume transmission finished 
      } 

      if (sck.Available > 0) 
      { 
       bytes = sck.Receive(bytesReceived, bytesReceived.Length, 0); 
       strReceived+=Encoding.ASCII.GetString(bytesReceived, 0, bytes); 
      } 

      Console.WriteLine("Received from server: " + strReceived); 
     } 
     Console.Read(); 

Le problème est que les premières demandes va throught mais pas le second, car la prise n'est plus disponible (socket valeur d'attribut « Availabe » est 0). Qu'est-ce que je fais mal? Quel serait le moyen le plus simple d'établir plusieurs demandes d'envoi-réception (dans l'ordre)?

Répondre

0

Socket. Available ne fait pas indiquer si la prise est disponible, mais les données entrantes est disponible pour la lecture:
https://msdn.microsoft.com/en-us/library/ee425135.aspx

Votre programme se ferme car il vérifie une réponse (données entrantes) immédiatement après l'envoi d'un message . Utilisez un Thread.Sleep avant de rechercher des données.

Peut-être que le message n'a même pas été envoyé, car Socket.Send le place juste dans le tampon de sortie de la carte d'interface réseau. Lorsque le socket envoie finalement le message, il va passer à l'état de connexion. S'il n'y a pas de réponse (sur une connexion TCP), il vous dira qu'il est déconnecté lorsque vous interrogez l'état. Sur UDP, il ne vous dira rien, car UDP est sans connexion.

0

Ce code fonctionne bien pour moi

private List<Socket> _clients = new List<Socket>(); 
    private Thread _dataReceiveThread; 
    private bool _isConnected; 

    private void DataReceive() 
    { 
     while (_isConnected) 
     { 
      List<Socket> clients = new List<Socket>(_clients); 
      foreach (Socket client in clients) 
      { 
       try 
       { 
        if (!client.Connected) continue; 
        string txt = ""; 
        while (client.Available > 0) 
        { 
         byte[] bytes = new byte[client.ReceiveBufferSize]; 
         int byteRec = client.Receive(bytes); 
         if (byteRec > 0) 
          txt += Encoding.UTF8.GetString(bytes, 0, byteRec); 
        } 
        if (!string.IsNullOrEmpty(txt)) 
         /* Here you can access the text received in the "txt" */ 
       } 
       catch (Exception e) 
       { 
        Exception_Handler(e); 
       } 
      } 
     } 
    } 

Il suffit d'exécuter ce code pour commencer

_isConnected = true; 
_dataReceiveThread = new Thread(DataReceive); 
_dataReceiveThread.Start();