2011-12-05 1 views
3

Lorsque j'utilise uniquement \r comme terminaison de ligne, la méthode StreamReader.ReadLine() ne fonctionne pas. Cela fonctionne si j'utilise Environment.NewLine, \r\n ou \ra ("a" étant n'importe quel caractère). Est-ce un bug? Le même problème ne se produit pas lors de l'utilisation de MemoryStream au lieu de NetworkStream. Quelles solutions de contournement puis-je utiliser si je ne peux pas modifier le protocole?StreamReader.ReadLine ne fonctionne pas sur TCP lors de l'utilisation de r comme terminaison de ligne

Mon service

Thread service = new Thread((ThreadStart)delegate 
{ 
    TcpListener listener = new TcpListener(IPAddress.Loopback, 2051); 
    listener.Start(); 
    using (TcpClient client = listener.AcceptTcpClient()) 
    using (NetworkStream stream = client.GetStream()) 
    using (StreamReader reader = new StreamReader(stream)) 
    using (StreamWriter writer = new StreamWriter(stream)) 
    { 
     writer.AutoFlush = true; 
     string inputLine = reader.ReadLine(); // doesn't work - freezes here 
     writer.Write("something\r"); 
    } 
}); 
service.Start(); 

Mon client

using (TcpClient client = new TcpClient("localhost", 2051)) 
using (NetworkStream stream = client.GetStream()) 
using (StreamWriter writer = new StreamWriter(stream)) 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    writer.AutoFlush = true; 
    writer.Write("something else\r"); 
    var message = reader.ReadLine(); // doesn't work even 
            // if I remove the freezing point above 
} 
+0

double possible (http://stackoverflow.com/questions/1099953/streamreader-readline-and-cr) [StreamReader.ReadLine et CR] –

Répondre

6

je résolu le problème avec ma propre méthode ReadLine

public static class StreamReaderExtensions 
{ 
    public static string ReadLineSingleBreak(this StreamReader self) 
    { 
     StringBuilder currentLine = new StringBuilder(); 
     int i; 
     char c; 
     while ((i = self.Read()) >= 0) 
     { 
      c = (char)i; 
      if (c == '\r' 
       || c == '\n') 
      { 
       break; 
      } 

      currentLine.Append(c); 
     } 

     return currentLine.ToString(); 
    } 
} 
0

Je pense que vous devriez utiliser \n caractère nouvelle ligne à la place.

+4

Je ne peux pas changer le protocole –

Questions connexes