如何在NamedPipe上发送带空行的多行字符串?
如果我发送一个字符串
string text= @"line 1
line2
line four
";
StreamWriter sw = new StreamWriter(client);
sw.Write(text);
我只在服务器端“第1行”:
StreamReader sr = new StreamReader(server);
string message = sr.ReadLine();
当我尝试这样的事情时
StringBuilder message = new StringBuilder();
string line;
while ((line = sr.ReadLine()) != null)
{
message.Append(line + Environment.NewLine);
}
它在客户端连接时挂起,只在客户端断开连接时才会释放。
如何在没有挂在此循环中的情况下获取整个字符串的任何想法? 我需要处理字符串并以相同的方式将其返回给客户端。
保持字符串的原始格式非常重要,包括空行和空格。
答案 0 :(得分:5)
StreamReader
是一个面向行的读者。它将读取第一行(由换行符终止)。如果您需要文本的其余部分,则必须发出多个读取行。那就是:
StreamReader sr = new StreamReader(server);
string message = sr.ReadLine(); // will get "line1"
string message2 = sr.ReadLine(); // will get "line2"
您不希望在网络流上“读取结束”,因为这将使读取器挂起,直到服务器关闭连接。这可能是一个很长的时间,可能会溢出缓冲区。
通常情况下,您会看到:
NetworkStream stream = CreateNetworkStream(); // however you're creating the stream
using (StreamReader reader = new StreamReader(stream))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// process line received from stream
}
}
它为您提供收到的每一行,并在服务器关闭流时终止。
如果您希望阅读器将整个多行字符串作为单个实体处理,则无法使用StreamReader
可靠地执行此操作。您可能希望在服务器上使用BinaryWriter
,在客户端上使用BinaryReader
。
答案 1 :(得分:1)
为什么不在StreamReader上调用ReadToEnd()
?
StreamReader sr = new StreamReader(server);
string message = sr.ReadToEnd();
答案 2 :(得分:0)
我通过使用令牌替换在命名管道上发送多行消息,用{cr}和{lf}等标记替换消息中的所有\ r和\ n,从而将多行消息转换为1行。
当然,我需要对接收方进行反向转换。
假设在源文本中永远不会找到替换的标记。
你可以通过替换所有" {"用{lp}。这样" {"成为你的逃脱角色。
您可以使用Regex进行这些替换。
效果很好,允许我使用StreamReader。