一个最简单的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#命名管道在進程間的雙向通信,簡單易懂。但是要實現完整的容錯和自定義通信協議,還是需要做很多的工作。
總結
以上是生活随笔為你收集整理的一个最简单的C#管道(NamePipe)全双工通信实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯-填空题-门牌制作
- 下一篇: AI 挖掘机解锁新技能:实现无人操作自主