当前位置: 首页 > 知识库问答 >
问题:

在c#中使用命名管道在两个进程之间进行双工操作

姬雪松
2023-03-14

我试图使用命名管道在同一台机器上的服务器和客户端进程之间进行通信。服务器向客户机发送一条消息,客户机对其执行操作并返回结果,服务器应该得到结果。

这里是服务器的代码:

using System;
using System.IO;
using System.IO.Pipes;

class PipeServer
{
    static void Main()
    {
        using (NamedPipeServerStream pipeServer =
            new NamedPipeServerStream("testpipe", PipeDirection.InOut))
        {
            Console.WriteLine("NamedPipeServerStream object created.");

            // Wait for a client to connect
            Console.Write("Waiting for client connection...");
            pipeServer.WaitForConnection();

            Console.WriteLine("Client connected.");
            try
            {
                // Read user input and send that to the client process.
                using (StreamWriter sw = new StreamWriter(pipeServer))
                {
                    sw.AutoFlush = true;
                    Console.Write("Enter text: ");
                    sw.WriteLine(Console.ReadLine());
                }

                pipeServer.WaitForPipeDrain();

                using (StreamReader sr = new StreamReader(pipeServer))
                {
                    // Display the read text to the console 
                    string temp;

                    // Wait for result from the client. 
                    while ((temp = sr.ReadLine()) != null)
                    {
                        Console.WriteLine("[CLIENT] Echo: " + temp);
                    }
                }

            }
            // Catch the IOException that is raised if the pipe is 
            // broken or disconnected.
            catch (IOException e)
            {
                Console.WriteLine("ERROR: {0}", e.Message);
            }
        }
    }
}

以下是客户端的代码:

using System;
using System.IO;
using System.IO.Pipes;

class PipeClient
{
    static void Main(string[] args)
    {
        using (NamedPipeClientStream pipeClient =
            new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
        {

            // Connect to the pipe or wait until the pipe is available.
            Console.Write("Attempting to connect to pipe...");
            pipeClient.Connect();

            Console.WriteLine("Connected to pipe.");
            Console.WriteLine("There are currently {0} pipe server instances open.",
               pipeClient.NumberOfServerInstances);
            using (StreamReader sr = new StreamReader(pipeClient))
            {
                // Display the read text to the console
                string temp;
                while ((temp = sr.ReadLine()) != null)
                {
                    Console.WriteLine("Received from server: {0}", temp);
                }
            }


            // send the "result" back to the Parent process.
            using (StreamWriter sw = new StreamWriter(pipeClient))
            {
                sw.AutoFlush = true;
                sw.WriteLine("Result");
            }

            pipeClient.WaitForPipeDrain();

        }
        Console.Write("Press Enter to continue...");
        Console.ReadLine();
    }
}

但是在服务器代码中,在线pipeServer。WaitForPipeDrain();我得到一个ObjectDisposedException,它说“无法访问封闭管道。”

在设置sw时,我在打开的客户端代码中也会遇到相同的错误。自动刷新为true。

基本上,我在c#中找不到一个名为管道的双工示例。我要么需要它,要么需要一个匿名管道的例子,有两个管道,一个用于读取,一个用于父进程和子进程之间的写入。

提前谢谢。

共有1个答案

东方河
2023-03-14

问题在于StreamWriter的using块,它将关闭底层流(这里是您的管道)。如果你不使用那个块,它应该可以工作。

您可以执行以下操作:

using (var pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut))
using (var streamReader = new StreamReader(pipeServer))
using (var streamWriter = new StreamWriter(pipeServer))
{
   // ... Your code ..
}

正如Johannes Egger指出的,StreamWriterDispose()上刷新流,因此应该首先处理StreamWriter,因此它是要处理的最内部对象。

 类似资料:
  • 那么,让我们从头开始:2个进程1个管道进行通信,对吗?不由于通信阻塞,一方等待另一方。我们需要通过另一个渠道获得第二个过程的结果。虽然这似乎是多余的,但事实并非如此。 让我们稍微改变一下:2个进程2个管道,您可以将一个进程称为服务器,另一个进程称为客户端。一个管道将作业发送到客户端,另一个管道用于将结果从客户端收集到服务器。 为了方便起见,我们使用进程名来调用每个管道,该进程名用于读取so、lon

  • 问题内容: 问题是: 假设我们有两个正在运行的Node.js进程:和。 结果中有返回的函数。 是否有一种从内部调用并获得结果的方法? 从我对Node.js的了解中,我仅找到一种使用套接字进行通信的解决方案。但是,这不是理想的,因为它将需要一个进程在端口上侦听。如果可能,我希望避免这种情况。 编辑: 经过一些问题,我很想补充一点,在层次结构中不能是的子进程,而恰恰相反。同样,如果有帮助,则只能有一个

  • 问题内容: 我正在尝试在两个程序之间创建双向通信通道(一个在Python中,另一个在C#中) 当我在两个C#程序或两个Python程序之间创建一个命名管道时,一切都很好,但是当我尝试(例如)从Python代码连接到C#服务器时,它不起作用: C#代码: 如果我在Python中使用代码块(永远不会返回) 如果我使用open函数,它只会建立连接,但不会发生任何事情: 现在,如果我关闭Python程序,

  • 问题内容: 我有一个名为private_messages的SQL表,带有字段(id,from,to,message,stamp)。标记字段对应于消息的日期 所以我需要什么查询: 1)得到两个用户之间的对话(按日期排序)? 我已经尝试过查询 但不起作用… 2)获取我和其他用户之间的最后一条消息,每个消息都有一个不同的用户,按日期排序(例如,像在faceebook中构建收件箱)? 问题答案: 1.)

  • 我的应用程序中有三个片段,其中需要传递和接收数据。我应该如何进行他们之间的沟通。我试图参考许多网站,但没有解决方案。 请给我推荐一些好的链接。 提前感谢。

  • 问题内容: 有两个Java文件,Server.java和Client.java。两者都放在单独的容器中。 DOCKER FILES: 我用于服务器的dockerfile(位于名为“ Server”的文件夹中)为: 客户端的dockerfile(位于名为``Client’‘的文件夹中)为: 构建容器: 使用以下容器构建容器 运行容器: 我使用命令运行图像。然后我首先运行serverimage。 我得