StreamReader.ReadLine не работает через TCP при использовании \ r в качестве ограничителя строки - PullRequest
3 голосов
/ 05 декабря 2011

Когда я использую только \r в качестве ограничителя строки, метод StreamReader.ReadLine() не работает.Это работает, если я использую Environment.NewLine, \r\n или \ra ("a" - любой символ).Это ошибка?Та же проблема не возникает при использовании MemoryStream вместо NetworkStream.Какие обходные пути можно использовать, если я не могу изменить протокол?

Мой сервис

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
}

Ответы [ 2 ]

7 голосов
/ 05 декабря 2011

Я решил проблему с помощью моего собственного метода 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 голосов
/ 05 декабря 2011

Я думаю, вы должны использовать \n вместо символа новой строки.

...