2011-12-05 10 views
3

\rのみをラインターミネータとして使用すると、StreamReader.ReadLine()メソッドは機能しません。 Environment.NewLine,\r\nまたは\ra(「a」は任意の文字)を使用すると機能します。これはバグですか? NetworkStreamの代わりにMemoryStreamを使用する場合、同じ問題は発生しません。プロトコルを変更できない場合はどのような回避策を使用できますか?StreamReader.ReadLineがラインターミネータとして rを使用しているときにTCPで動作しません

マイサービス

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

私のクライアント

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

[StreamReader.ReadLine及びCR(http://stackoverflow.com/questions/1099953/streamreader-readline-and-cr)の可能な重複を解決し –

答えて

6

自分の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

私はあなたの代わりに改行文字として\nを使用するべきだと思います。

+4

プロトコルを変更できません –

関連する問題