[C#]基于命名管道的一对多进程间通讯

在工作中碰到了一个进程间通讯的问题,大概是这样的:

项目本身是.net Core做的,但是有部分功能Core中不方便实现,有的是依赖Framework,有的是因为权限和安全问题。

那基于这个问题,问了问度娘进程通讯的问题,但是一水大神都在说,Socket啊,WebApi啊,内存共享啊,文件共享啊,等等。好不容易有个人在问管道的问题,大家都是一个口气:“用这么古老的东西干什么?”

既然大家都说管道这个“老古董”,那我今天就来扒扒这个坟。

 先来尝试一下管道通讯

首先要清楚什么是管道,有不少大神写了,我就这里就不废话了,给个链接  Windows中的管道技术 

基础概念知道了,接下来看看网上的别人怎么做的 C#命名管道通信

这篇Blog中用的是 System.IO.Pipes 下的 NamedPipeClientStream 和 NamedPipeServerStream,从微软的官方看这个命名空间是System.Core.dll中提供的,无论是Framework还是Core都可以使用

  

建立一个解决方案,下面两个控制台应用,一个Framework的作为服务端,一个Core的作为客户端。把Blog的代码粘进去,运行OK。(废话)

 

接下来修改代码,让程序支持半双工通讯。

为什么是半双工?不是单工或者双工?

C/S的沟通方式还是模拟的“请求-响应”模式,既然需要“响应”那么单工自然不满足需求,而服务端本身不需要在客户端发送请求数据的同时回传数据,自然全双工也没有意义,并发也不是靠双工解决的。所以选择了实现比较简单的半双工模式。

修改后的代码:

[C#]基于命名管道的一对多进程间通讯

[C#]基于命名管道的一对多进程间通讯

1 using System; 2 using System.IO; 3 using System.IO.Pipes; 4 5 namespace Server 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut, 1)) 12 { 13 try 14 { 15 pipeServer.WaitForConnection(); 16 pipeServer.ReadMode = PipeTransmissionMode.Byte; 17 StreamWriter Writer = new StreamWriter(pipeServer); 18 StreamReader Reader = new StreamReader(pipeServer); 19 20 while (true) 21 { 22 var input = Reader.ReadLine(); 23 if (string.IsNullOrEmpty(input)) 24 { 25 break; 26 } 27 28 Console.WriteLine($"Server Get Message:{input}"); 29 Writer.WriteLine($"Server Get Message:{input}"); 30 Writer.Flush(); 31 } 32 } 33 catch (IOException e) 34 { 35 throw e; 36 } 37 } 38 Console.ReadKey(); 39 } 40 } 41 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfwjs.html