1

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

它在客户端连接时挂在循环中,仅在客户端断开连接时释放。

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

保持字符串的原始格式包括空行和空格是很重要的。

4

3 回答 3

5

StreamReader是面向行的阅读器。它将读取第一行(以换行符结尾)。如果您想要其余的文本,则必须发出多个 readlines。那是:

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在服务器上使用 a 并BinaryReader在客户端上使用 a 。

于 2010-12-10T20:46:06.493 回答
1

为什么不直接调用ReadToEnd()StreamReader?

StreamReader sr = new StreamReader(server);
string message = sr.ReadToEnd();
于 2010-12-10T19:52:48.033 回答
0

我通过使用令牌替换将消息中的所有 \r 和 \n 替换为像 {cr} 和 {lf} 这样的令牌,从而完成了通过命名管道发送多行消息,从而将多行消息转换为 1 行。

当然,我需要做接收端的反向转换。

假设是永远不会在源文本中找到被替换的标记。

您可以通过将所有“{”替换为 {lp} 来确保发生这种情况。这样,“{”就成为您的转义字符。

您可以使用 Regex 进行这些替换。

这很好用,让我可以使用 StreamReader。

于 2018-04-24T02:07:45.937 回答