业务背景:在做酒店自助机软件的时候,一台机器上有几个门锁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 }