一个最简单的C#管道(NamePipe)全双工通信实例

命名管道NamedPipe,可以用于进程间通信。本文创建两个exe工程,做为两个进程。一个为管道客户端,一个为管道服务端。互为双向通信。例子摘自MSDN。用控制台或者winForm,启动时,调用对应的函数,并打好断点就可以做测试了。

        首先需要引用命名空间,using System.IO;   using System.IO.Pipes;

        注:下面读写用了两种方式。

1)服务端

        a.使用using非托管释放。管道名称是testpipe。而工作方式是双向的InOut。

        b.等待连接时阻塞的,直到客户端连接进来。

        c.pipeServer.Read也是阻塞的,等待接收客户端发送的消息,数据存在data中。

        d.创建一个streamWriter并向客户端发送数据

using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut))
            {
                pipeServer.WaitForConnection();

                var data = new byte[10240];
                var count = pipeServer.Read(data, 0, 10240);

                using (StreamWriter sw = new StreamWriter(pipeServer))
                {
                    sw.AutoFlush = true;
                    sw.WriteLine("send to client");
                }
             }

2)客户端

        a.使用using非托管释放。创建客户端。

        b.连接到服务端,调用Connect的时候,服务端如果有断点可以看到跳转到了waitForConnection下面。

        c.使用pipeClient.Write向服务端发送值,服务端的pipeServer.Read响应。

        d.创建一个StreamReader ,接收服务端发送过来的值。存放在temp中
  using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
            {
                pipeClient.Connect();

                using (StreamReader sr = new StreamReader(pipeClient))
                {
                    var data = new byte[10240];
                    data = System.Text.Encoding.Default.GetBytes("send to server");
                    pipeClient.Write(data, 0, data.Length);

                    string temp;
                    while ((temp = sr.ReadLine()) != null) ;
                }
            }

末:以上简短的两段程序就实现了C#命名管道在进程间的双向通信,简单易懂。但是要实现完整的容错和自定义通信协议,还是需要做很多的工作

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的双工管道通信可以通过使用命名管道实现,命名管道是一种IPC方式,可以用于进程间通信。以下是一个简单的示例代码: ```csharp using System; using System.IO; using System.IO.Pipes; using System.Text; class Program { static void Main(string[] args) { // 创建命名管道服务器 var server = new NamedPipeServerStream("testpipe", PipeDirection.InOut, 1); Console.WriteLine("等待客户端连接..."); server.WaitForConnection(); Console.WriteLine("客户端已连接。"); // 读取客户端发送的消息 var reader = new StreamReader(server); var message = reader.ReadLine(); Console.WriteLine($"客户端: {message}"); // 发送响应消息给客户端 var writer = new StreamWriter(server); writer.WriteLine("Hello, client!"); writer.Flush(); // 关闭管道 server.Close(); } } ``` 客户端代码: ```csharp using System; using System.IO; using System.IO.Pipes; using System.Text; class Program { static void Main(string[] args) { // 连接到命名管道服务器 var client = new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut); Console.WriteLine("连接到服务器..."); client.Connect(); Console.WriteLine("已连接到服务器。"); // 发送消息给服务器 var writer = new StreamWriter(client); writer.WriteLine("Hello, server!"); writer.Flush(); // 读取服务器响应消息 var reader = new StreamReader(client); var message = reader.ReadLine(); Console.WriteLine($"服务器: {message}"); // 关闭管道 client.Close(); } } ``` 以上代码实现了一个简单的双工管道通信,当客户端连接到命名管道服务器后,客户端和服务器可以相互发送消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值