使用\ r作为行结束时StreamReader.ReadLine不工作在TCP [英] StreamReader.ReadLine not working over TCP when using \r as line terminator

查看:150
本文介绍了使用\ r作为行结束时StreamReader.ReadLine不工作在TCP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我只用 \ r 作为行结束符,在 StreamReader.ReadLine()方法不工作。它的工作原理,如果我用 Environment.NewLine \ r \ñ \ RA (一是任何字符)。这是一个错误?使用的MemoryStream代替的NetworkStream时,不会出现同样的问题。我可以使用哪些解决方法,如果我不能更改协议?

我的服务

 主题的服务=新主题((的ThreadStart)委托
{
    的TcpListener监听器=新的TcpListener(IPAddress.Loopback,2051);
    listener.Start();
    使用(TcpClient的客户端= listener.AcceptTcpClient())
    使用(的NetworkStream流= client.GetStream())
    使用(StreamReader的读者=新的StreamReader(流))
    使用(StreamWriter的作家=新的StreamWriter(流))
    {
        writer.AutoFlush = TRUE;
        字符串inputLine = reader.ReadLine(); //不工作 - 锁定在这里
        writer.Write(东西\ r);
    }
});
service.Start();
 

我的客户

 使用(TcpClient的客户端=新的TcpClient(本地主机,2051))
使用(的NetworkStream流= client.GetStream())
使用(StreamWriter的作家=新的StreamWriter(流))
使用(StreamReader的读者=新的StreamReader(流))
{
    writer.AutoFlush = TRUE;
    writer.Write(别的东西\ r);
    VAR消息= reader.ReadLine(); //不能正常工作,甚至
                                     //如果我删除高于冰点
}
 

解决方案

我解决了这个问题,我自己的ReadLine方法

 公共静态类StreamReaderExtensions
{
    公共静态字符串ReadLineSingleBreak(此StreamReader的个体经营)
    {
        StringBuilder的currentLine =新的StringBuilder();
        INT I;
        焦炭℃;
        而((ⅰ= self.Read())> = 0)
        {
            C =(焦炭)我;
            如果(C =='\ r'
                || ç=='\ N')
            {
                打破;
            }

            currentLine.Append(C);
        }

        返回currentLine.ToString();
    }
}
 

When I use only \r as a line terminator, the StreamReader.ReadLine() method doesn't work. It works if I use Environment.NewLine, \r\n or \ra ("a" being any character). Is this a bug? The same problem doesn't occurs when using MemoryStream instead of NetworkStream. What workarounds can I use if I can't change the protocol?

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

My 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
}

解决方案

I solved the problem with my own ReadLine method

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

这篇关于使用\ r作为行结束时StreamReader.ReadLine不工作在TCP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆