在NamedPipe上发送多行字符串?

时间:2010-12-10 19:48:15

标签: c# streamreader named-pipes streamwriter

如何在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);
}

它在客户端连接时挂起,只在客户端断开连接时才会释放。

如何在没有挂在此循环中的情况下获取整个字符串的任何想法? 我需要处理字符串并以相同的方式将其返回给客户端。

保持字符串的原始格式非常重要,包括空行和空格。

3 个答案:

答案 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。