月夜钓钱江鱼

醉后不知天在水,满船清梦压星河。
业务背景:在做酒店自助机软件的时候,一台机器上有几个门锁SDK,但是SDK在一个程序实例上只能开启一个,不然有冲突,一个进程只能加载一个实例,于是我们在应用程序启动的时候,根据配置,动态启动预先设置好的exe程序,门锁SDK组件宿主到不同的exe文件中,这样我们主程序只需要和不同exe文件之间进行通信就可以了

管道之间通信主要用到C#中两个类分别为NamedPipeClientStream和NamedPipeServerStream类

客户端发起连接和发送数据

 1  private void SendMessage_Click(object sender, RoutedEventArgs e)
 2  {
 3    using (NamedPipeClientStream namedPipeClient = new NamedPipeClientStream("Server-pipe"))
 4    {
 5          namedPipeClient.Connect(3000);
 6          var message = "How are you";
 7          byte[] outMessageByte = UTF8Encoding.UTF8.GetBytes(message);
 8          namedPipeClient.Write(outMessageByte, 0, outMessageByte.Length);
 9          byte[] inMessageByte = new byte[2048];
10          namedPipeClient.Read(inMessageByte, 0, 2048);
11          var inMessage = UTF8Encoding.UTF8.GetString(inMessageByte).TrimEnd('\0');
12           txtMesage.Text=inMessage;
13      }
14 } 

服务端接收

 1 using (NamedPipeServerStream namedPipeServer = new NamedPipeServerStream("Server-pipe", PipeDirection.InOut, 4, PipeTransmissionMode.Message))
 2 {
 3     while (true)
 4     {
 5         if (!namedPipeServer.IsConnected)
 6         {
 7             namedPipeServer.WaitForConnection();
 8         }
 9         byte[] inMessageByte = new byte[2048];
10         namedPipeServer.Read(inMessageByte, 0, 2048);
11         string message = UTF8Encoding.UTF8.GetString(inMessageByte);
12         string result = "I'm fine ,thank you";
13         try
14         {
15             Console.WriteLine(message);
16         }
17         catch (Exception ex)
18         {
19             Console.WriteLine(ex.Message);
20         }
21         if (result != string.Empty)
22         {
23             byte[] payResult = UTF8Encoding.UTF8.GetBytes(result);
24             namedPipeServer.Write(payResult, 0, payResult.Length);
25         }
26         namedPipeServer.Disconnect();
27     }
28 }

 

posted on 2022-11-29 09:55  湘灵  阅读(416)  评论(0编辑  收藏  举报