使用\ r作为行结束时StreamReader.ReadLine不工作在TCP [英] StreamReader.ReadLine not working over TCP when using \r as line terminator
本文介绍了使用\ 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屋!
查看全文