2017-04-20 14 views
0

Ich bin mit Sockets für TCP-IP-Verbindung und ich möchte ein einfaches System senden-erhalten von der Client-Seite einrichten.C# Client-Socket mehrere senden und empfangen

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(); 

Das Problem ist, dass erste Anfragen geht Throught aber die zweite nicht, weil Buchse nicht mehr vorhanden ist (Buchse „Availabe“ Attributwert ist 0). Was mache ich falsch? Was wäre der einfachste Weg, mehrere Sende-Empfangs-Anfragen (in der Reihenfolge) zu erstellen?

Antwort

0

Socket. Available tut NICHT anzuzeigen, ob die Steckdose verfügbar ist, aber eingehende Daten zum Lesen zur Verfügung:
https://msdn.microsoft.com/en-us/library/ee425135.aspx

Ihr Programm beendet, weil es für eine Antwort (eingehende Daten) überprüft unmittelbar nach einer Botschaft zu senden . Verwenden Sie eine Thread.Sleep, bevor Sie nach Daten suchen.

Vielleicht wurde die Nachricht nicht einmal gesendet, weil Socket.Send es nur in den Ausgabepuffer der Netzwerkkarte platziert. Wenn der Socket die Nachricht schließlich sendet, wird der Verbindungsstatus aktualisiert. Wenn es keine Antwort (auf einer TCP-Verbindung) erhält, wird es Ihnen sagen, dass es getrennt ist, wenn Sie den Status abfragen. Auf UDP wird es nichts sagen, weil UDP verbindungslos ist.

0

Dieser Code funktioniert gut für mich

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); 
       } 
      } 
     } 
    } 

einfach diesen Code ausführen, um loszulegen

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