2009-12-03 24 views
6

Ich versuche immer noch ein bisschen zu verbessern, was ich vorher geschrieben habe. Jetzt hatte ich ein Problem mit dem Empfang von Daten. Ich habe ein Programm, das ich benutze, um Zeichenkette unter Verwendung von tcpClient zu einem Programm zu senden, in dem ich auf einem bestimmten Hafen lausche. Es funktioniert gut, so habe ich beschlossen, Daten zu senden, nach vorn ein weiteres MalEmpfangen und Senden von Daten in C#

public static void receiveThread() 
{ 
    while (true) 
    { 
     TcpListener tcpListener = new TcpListener(IPAddress.Any, port); 
     tcpListener.Start(); 

     Console.WriteLine("Waiting for connection..."); 

     TcpClient tcpClient = tcpListener.AcceptTcpClient(); 

     Console.WriteLine("Connected with {0}", tcpClient.Client.RemoteEndPoint); 

     while (!(tcpClient.Client.Poll(20, SelectMode.SelectRead))) 
     { 
      NetworkStream networkStream = tcpClient.GetStream(); 
      StreamReader streamReader = new StreamReader(networkStream); 

      data = streamReader.ReadLine(); 

      if (data != null) 
      { 
       Console.WriteLine("Received data: {0}", data); 
       send(data); // Here Im using send Method 
      } 
     } 
     Console.WriteLine("Dissconnected...\n"); 
     tcpListener.Stop(); 
    } 
} 

/// <summary> 
/// Sending data 
/// </summary> 
/// <param name="data">Data to send</param> 
public static void send(string data) 
{ 
    TcpClient tcpClient = new TcpClient(); 
    try 
    { 
     tcpClient.Connect(ipAddress, sendPort); 
     Console.WriteLine("Connected with {0}", tcpClient.Client.RemoteEndPoint); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
    if (tcpClient.Connected) 
    { 
     NetworkStream networkStream = tcpClient.GetStream(); 
     StreamWriter streamWriter = new StreamWriter(networkStream); 
     Console.WriteLine("Messege {0} to {1}", data, tcpClient.Client.RemoteEndPoint); 
     streamWriter.WriteLine(data); 
     streamWriter.Flush(); 
     tcpClient.Close(); 
    } 
} 

Manchmal funktioniert es gut, aber öfter, nennen wir es einen Empfänger, kann nicht bekommen, was Im zu senden versuchen. Und ich weiß wirklich nicht, was damit nicht stimmt. Sieht so aus, als könnte es ein Problem mit der send-Methode geben. Hier ist ein Beispiel von Empfängern Ausgabe

Waiting for connection... 
Connected with 127.0.0.1:52449 
Dissconnected... 

Waiting for connection... 
Connected with 127.0.0.1:52450 
Received data: qweqwe 
Dissconnected... 

Waiting for connection... 
Connected with 127.0.0.1:52451 
Dissconnected... 

Waiting for connection... 
Connected with 127.0.0.1:52452 
Dissconnected... 

Waiting for connection... 
Connected with 127.0.0.1:52453 
Received data: zxczx 
Dissconnected... 

Waiting for connection... 
Connected with 127.0.0.1:52454 
Dissconnected... 

Waiting for connection... 
Connected with 127.0.0.1:52455 
Received data: aasd 
Dissconnected... 

Waiting for connection... 
Connected with 127.0.0.1:52457 
Received data: www 
Dissconnected... 

Antwort

1

Stellen Sie sicher, dass die Daten tatsächlich existiert auf dem Strom vor Geistern zu jagen. Wenn es IMMER Daten gibt, können wir das Problem angehen, aber wenn wir es logisch betrachten, scheint es so, als ob der Stream entweder ausgemerzt wird oder es nur keine Daten darauf gibt.

+0

scheint es hängt davon ab, wie schnell die Daten ein- und nicht jeder davon kann gesendet werden, so dass das meiste davon verloren geht. Ihre Antwort ließ mich vorsichtiger darüber nachdenken:> – Allek

6

Mehr Probleme hier:

  1. StreamReader hat einen 4 kB-Puffer und wird versuchen, so viel wie möglich in dem ersten Aufruf von ReadLine() zu lesen. Das Ergebnis ist, dass Sie Daten im StreamReader haben und in Poll() gehen können, wenn keine Daten mehr verfügbar sind, weil sie bereits gelesen wurden.
  2. Poll() dauert Mikrosekunden. Warten auf 0.0230 für eingehende Daten wird wahrscheinlich falsch zurückgegeben, es sei denn, die Daten sind dort, bevor Sie Poll() aufrufen.
  3. Sie erstellen bei jeder Iteration einen neuen StreamReader, der möglicherweise bereits im vorherigen gelesene Daten verwirft.

Wenn Sie gerade Linien gehen zu lesen und ein Timeout wollen und ein StreamReader, würde ich so etwas wie:

delegate string ReadLineDelegate(); 
... 
using (NetworkStream networkStream = tcpClient.GetStream()) { 
    StreamReader reader = new StreamReader(networkStream); 
    ReadLineDelegate rl = new ReadLineDelegate (reader.ReadLine); 
    while (true) { 
     IAsyncResult ares = rl.BeginInvoke (null, null); 
     if (ares.AsyncWaitHandle.WaitOne (100) == false) 
      break; // stop after waiting 100ms 
     string str = rl.EndInvoke (ares); 
     if (str != null) { 
      Console.WriteLine ("Received: {0}", str); 
      send (str); 
     } 
    } 
} 
+0

Ich weiß noch nicht, was hier los ist. Ich bin nicht so gut darin, wie ich gerne wäre. Kannst du ein bisschen mehr darüber erklären? und gibt es eine andere und bessere Option, diese Daten zu empfangen und ohne StreamReader zu senden? Es ist mein erster Versuch so etwas zu schreiben. Ich bin mir nicht sicher, was besser oder schlechter ist. – Allek

+0

Was der obige Code tut, liest Zeilen, bis der Stream von der Serverseite geschlossen ist oder bis es mehr als 100ms dauert, um einen zu lesen. Wie bei anderen Optionen zum Lesen/Schreiben, hängt es davon ab, was Sie tun möchten. Die "natürliche" Schnittstelle soll Byte [] mit Socket verwenden. – Gonzalo

Verwandte Themen