c# - 命名管道意外结果

标签 c# named-pipes

有一个简单的命名管道服务器:

        static void Main(string[] args)
    {
        StartServer();
        Console.Read();
    }

    static void StartServer()
    {
        Task.Factory.StartNew(() =>
        {
            var server = new NamedPipeServerStream("TestPipes");

            server.WaitForConnection();
            StreamReader reader = new StreamReader(server);
           StreamWriter writer = new StreamWriter(server);

            while (true)
            {

                var line = reader.ReadLine();
            if (line == "Y")
            {

                for (int i = 0; i < 5; i++)
                    writer.WriteLine(i.ToString());
                writer.Flush();

            }

            if (line=="N")
            {
                for (int i = 10; i < 15; i++)
                    writer.WriteLine(i.ToString());
                writer.Flush();
            }   


            }
        });
    }

和非常简单的客户端:

static void Main(string[] args)
    {

        //Client
        var client = new NamedPipeClientStream(Environment.MachineName, "TestPipes");

        client.Connect();
        Console.WriteLine($"Connection esteblished at {DateTime.Now}, you may continue");
        StreamReader reader = new StreamReader(client);
        StreamWriter writer = new StreamWriter(client);

        while (true)
        {

            string input = Console.ReadLine();
            if (String.IsNullOrEmpty(input)) continue;
            writer.WriteLine(input);
              writer.Flush();

            string serverString;
            while (reader.Peek() >= 0)
            {
                serverString = reader.ReadLine();
                Console.WriteLine(serverString);

            } 


        }
    }

但出于某种原因,只有第一个命令正在完成。 例如,如果我输入“Y”得到输出“Y”,然后当输入“N”时,服务器什么也没有。 需要让它连续工作。 谢谢。

最佳答案

那是因为在您的客户端中,您在 while 循环之外定义了 StreamReader reader = new StreamReader(client);,所以在第一次迭代时,当读取器点击最后一行时,底层流永远不会被重置,所以 reader.Peek() >= 0 为后续调用产生 false。

将客户端读取器对象的声明移到 while 循环中:

var client = new NamedPipeClientStream(Environment.MachineName, "TestPipes");
client.Connect();
Console.WriteLine($"Connection esteblished at {DateTime.Now}, you may continue");

StreamWriter writer = new StreamWriter(client);
while (true)
{
    StreamReader reader = new StreamReader(client);
    string input = Console.ReadLine();
    if (String.IsNullOrEmpty(input)) continue;
    writer.WriteLine(input);
    writer.Flush();

    string serverString;
    while (reader.Peek() >= 0)
    {
        serverString = reader.ReadLine();
        Console.WriteLine(serverString);
    }
}

关于c# - 命名管道意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49497643/

相关文章:

c# - 使用 SqlBulkCopy 和 C# 自动添加 SQL 日期时间

c# - 如何在 View 中包装列表列

c# - WP7 图像库

c# - 找到与名为 'Account' 的 Controller 匹配的多个类型。 MVC 4 & 使用 RouteConfig.CS

c# - ubuntu 中 kernel32.dll 的等价物是什么?

c# - 使用正则表达式在 html 标记之间插入文本

python - 嵌入式CPython,使用命名管道进行线程交互

c# - Global Application_Start 未触发使用命名管道调用我的服务

c# - 什么是命名管道 (net.pipe) 限制?

sqlite vs 共享内存应用程序 vs ipc vs?