Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过NamedPipe发送多行字符串?_C#_Streamreader_Named Pipes_Streamwriter - Fatal编程技术网

C# 通过NamedPipe发送多行字符串?

C# 通过NamedPipe发送多行字符串?,c#,streamreader,named-pipes,streamwriter,C#,Streamreader,Named Pipes,Streamwriter,如何通过命名管道发送带有空行的多行字符串 如果我发送一个字符串 string text= @"line 1 line2 line four "; StreamWriter sw = new StreamWriter(client); sw.Write(text); 我只在服务器端获取第1行: 当我尝试这样的事情时 StringBuilder message = new StringBuilder(); string line; while ((line = sr.ReadLine()) !

如何通过命名管道发送带有空行的多行字符串

如果我发送一个字符串

string text= @"line 1 
line2

line four
";
StreamWriter sw = new StreamWriter(client);
sw.Write(text);
我只在服务器端获取第1行:

当我尝试这样的事情时

StringBuilder message = new StringBuilder();
string line;
while ((line = sr.ReadLine()) != null)
{
    message.Append(line + Environment.NewLine);
}
它在客户端连接时挂起在循环中,只有在客户端断开连接时才会释放

你知道我怎样才能不挂在这个环上就得到整根绳子吗? 我需要处理字符串并以相同的方式将其返回给客户端

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

为什么不调用StreamReader

StreamReader sr = new StreamReader(server);
string message = sr.ReadToEnd();
为什么不直接访问StreamReader

StreamReader sr = new StreamReader(server);
string message = sr.ReadToEnd();
StreamReader是一种面向行的阅读器。它将读取以换行符结尾的第一行。如果您想要文本的其余部分,则必须发出多个readline。即:

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。

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

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。

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

当然,我需要对接收端进行反向转换

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

你可以用{lp}替换所有的{,这样{就变成了你的转义字符

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


这非常有效,并允许我使用StreamReader。

我通过使用令牌替换将消息中的所有\r和\n替换为{cr}和{lf}之类的令牌,从而将多行消息转换为一行,从而通过命名管道发送多行消息

当然,我需要对接收端进行反向转换

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

你可以用{lp}替换所有的{,这样{就变成了你的转义字符

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


这非常有效,允许我使用StreamReader。

同样的效果,他只有在客户端断开连接时才会释放。同样的效果,他只有在客户端断开连接时才会释放。使用BinaryWriterstring消息和BinaryReaderstring消息非常有效。谢谢!使用BinaryWriterstring消息和BinaryReaderstring消息非常有效谢谢你的魅力!