当前位置: 首页 > 编程语言 > C#

在c#中使用命名管道在两个进程之间进行双工操作分享

时间:2023-04-10 13:12:52 C#

在c#中使用命名管道在两个进程之间进行双工操作我正在尝试在同一台机器上使用命名管道在服务器和客户端进程之间进行通信。服务器向客户端发送消息,客户端对其进行处理并返回结果,服务器应该得到结果。这是服务器的代码:usingSystem;使用System.IO;使用System.IO.Pipes;类PipeServer{staticvoidMain(){using(NamedPipeServerStreampipeServer=newNamedPipeServerStream("testpipe",PipeDirection.InOut)){Console.WriteLine("已创建NamedPipeServerStream对象。");//等待客户端连接Console.Write("Waitingforclientconnection...");pipeServer.WaitForConnection();Console.WriteLine("客户端已连接。");try{//读取用户输入并将其发送到客户端进程。使用(StreamWritersw=newStreamWriter(pipeServer)){sw.AutoFlush=true;Console.Write("请输入文字:");sw.WriteLine(Console.ReadLine());}pipeServer.WaitForPipeDrain();using(StreamReadersr=newStreamReader(pipeServer)){//将读取的文本显示到控制台stringtemp;//等待客户端的结果。while((temp=sr.ReadLine())!=null){Console.WriteLine("[CLIENT]Echo:"+temp);}}}//如果管道是b,则捕获引发的IOException损坏或断开连接。catch(IOExceptione){Console.WriteLine("错误:{0}",e.Message);}}}}这是客户端的代码:usingSystem;使用System.IO;使用System.IO.Pipes;classPipeClient{staticvoidMain(string[]args){using(NamedPipeClientStreampipeClient=newNamedPipeClientStream(".","testpipe",PipeDirection.InOut)){//连接到管道或等待管道可用。Console.Write("正在尝试连接到管道...");pipeClient.Connect();Console.WriteLine("已连接到管道。");Console.WriteLine("当前有{0}个管道服务器实例打开。",pipeClient.NumberOfServerInstances);using(StreamReadersr=newStreamReader(pipeClient)){//将读取的文本显示到控制台stringtemp;while((temp=sr.ReadLine())!=null){Console.WriteLine("从服务器收到:{0}",temp);}}//将“结果”发送回父进程。使用(StreamWritersw=newStreamWriter(pipeClient)){sw.AutoFlush=true;sw.WriteLine(“结果”);}pipeClient.WaitForPipeDrain();}Console.Write("按回车键继续...");控制台.ReadLine();但是在服务器代码中,行pipeServer.WaitForPipeDrain();我收到一个ObjectDisposedException说“无法访问关闭的管道”当sw.AutoFlush设置为true时,我在客户端代码中遇到了同样的错误。基本上我在c#中找不到双工命名管道的任何示例。我要么需要它,要么需要一个非普通管道的示例,其中两个管道用于读取,一个用于在父进程和子进程之间写入。提前致谢。问题是StreamWriter的using块,它关闭了底层Stream(这是你的管道)。如果您不使用该块,它应该可以工作。您可以执行以下操作:using(varpipeServer=newNamedPipeServerStream("testpipe",PipeDirection.InOut)).Yourcode..}正如JohannesEgger指出的那样,StreamWriter在Dispose()上刷新流,因此StreamWriter应该首先被处理,因此是最里面的处理对象。以上就是《C#学习教程:c#中使用命名管道的两个进程间的双工操作》的全部内容。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: