C# 命名管道通信
来源:互联网 发布:手办 熊孩子 知乎 编辑:程序博客网 时间:2024/05/21 16:23
命名管道(NamedPipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是:命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
最近做项目需要在C++和C#程序之间进行通信,查了好多资料,本来觉得挺复杂,其实弄明白之后很简单。C++与C#都是Windows平台的,进行管道通信其实都是调用系统API只不过都是封装好了的,两者之间写的通信都是相通的,只要创建的管道名相同即可。比如用C++创建出服务端C++Sever和客户端C++Cliet,他们之间可以直接收发消息,同时C#创建出服务端C#Sever和客户端C#Cliet可以相互发消息。都实现之后,用C++Sever和C#Client组合或者C++Client和C#Sever组合使用基本是没有问题的,可能传输时有字符编码问题,可以调试解决。以下是我写的C#服务端和客户端的两个控制台程序。
服务端:
class Program { static void Main(string[] args) { WaitData(); } private static void WaitData() { using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("mynamedpipe", PipeDirection.InOut, 5))//创建管道 { try { pipeServer.WaitForConnection();//等待客户端连接 pipeServer.ReadMode = PipeTransmissionMode.Byte; Console.WriteLine("sucess connected?"+pipeServer.IsConnected); StreamReader sr = new StreamReader(pipeServer);//获取管道输入流 StreamWriter sw = new StreamWriter(pipeServer);//获取管道输出流 string result; while (true)//循环接收客户端消息 { result = sr.ReadLine(); if (result == null || result == "bye") break; Console.WriteLine(result); sw.WriteLine("I'm Sever!");//返回客户端信息 sw.Flush();//清除缓存流,注意必须有这一步,否则会造成管道堵塞 } Console.ReadKey(); } catch (IOException e) { throw e; } } } }
客户端:
class Program { static void Main(string[] args) { StartClient(); Console.ReadKey(); } public static void StartClient() { string input; try { using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("localhost", "mynamedpipe"))//与服务端管道名一致,如果连接C++服务端,名称一致即可,“localhost”可以更换为IP地址,也可以进行网络通信 { pipeStream.Connect();//连接服务端 if (!pipeStream.IsConnected) { Console.WriteLine("Failed to connect ...."); return; } StreamWriter sw = new StreamWriter(pipeStream); StreamReader sr = new StreamReader(pipeStream); while (true)//循环输入 { input = Console.ReadLine(); Console.WriteLine("SendMessage:" + input); sw.WriteLine(input);//传递消息到服务端 sw.Flush();//注意一定要有,同服务端一样 string temp = ""; temp = sr.ReadLine();//获取服务端返回信息 Console.WriteLine("replyContent:" + temp ); } } } catch (Exception e) { Console.WriteLine(e.Message+"\n"+e.StackTrace); } } }
需要注意的问题:1.管道通信为半双工通信,信息的进出都是从一个管道进出,类似对讲机,信息要么进要么出,有时候写不好就会造成阻塞,因此往流里面写完东西需要flush().2.如果C++与C#通信,C++没有flush()函数,在传递的字符串中加上\n即可.3.传输过程注意编码问题.
阅读全文
2 0
- C# 命名管道通信
- C# NamedPipe 命名管道通信
- C# 管道通信-命名管道(一)
- c# 管道通信-命名管道(二)
- C#中使用命名管道通信失败
- 命名管道进程通信
- C++和C#进程之间通过命名管道通信
- C#中使用命名管道进行进程通信的实例
- C#命名管道进程通信(一单向)
- 进程间通信--管道、命名管道、FIFO
- 进程通信:匿名管道和命名管道
- 进程间通信---命名管道
- 进程间通信---命名管道
- 进程通信系列-命名管道
- 【IPC通信】FIFO命名管道
- 进程间通信--命名管道
- 【IPC通信】命名管道FIFO
- 进程间通信----命名管道
- 大端/小端模式
- 抽象类和接口的区别
- HYSBZ1212-L语言
- leetcode 62 递归的倒推和数组的正推
- pata1097
- C# 命名管道通信
- java十进制转二进制
- ubuntu14.04下安装eclipse+PyDev
- 1014. Product of Digits
- 浅析AOP及其实现
- IDEA更换SVN地址
- ptmalloc内存分配分析
- js的数组与字符串互相转换
- Java并发编程:CopyOnWriteArrayList