最近在一次项目中使用到了C#中命名管道,所以在此写下一篇小结备忘。

为什么要使用命名管道呢?为了实现两个程序之间的数据交换。假设下面一个场景。在同一台PC上,程序A与程序B需要进行数据通信,此时我们就可以使用命名管道技术来实现。命名管道的两个对象。NamedPipeClientStream 和 NamedPipeServerStream 对象。请求通信的一方为Client端,发送数据的一方为Server端。

使用NamedPipe来通信,如果Server端崩溃了,不会影响到客户端。

下面我们通过一个例子来说明:

Server端:

UI:

    <Grid><Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <TextBlock Text="Received Message:" Grid.Row="1" Margin="10"/> <TextBlock x:Name="tblRecMsg" VerticalAlignment="Center" Grid.Row="1" Grid.Column="1"/> <Button Content="Send" Grid.Row="2" Margin="10" Click="OnSend"/> <TextBox x:Name="txtSendMsg" VerticalAlignment="Center" Grid.Row="2" Grid.Column="1" Margin="10"/> </Grid>

Code:

private NamedPipeServerStream _pipe;private const string PipeName = "PipeSample"; private const int PipeInBufferSize = 4096; private const int PipeOutBufferSize = 65535; private Encoding encoding = Encoding.UTF8; public MainWindow() { InitializeComponent(); _pipe = new NamedPipeServerStream ( PipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous | PipeOptions.WriteThrough, PipeInBufferSize, PipeOutBufferSize ); _pipe.BeginWaitForConnection(WaitForConnectionCallback, _pipe); } private void WaitForConnectionCallback(IAsyncResult ar) { var pipeServer = (NamedPipeServerStream)ar.AsyncState; pipeServer.EndWaitForConnection(ar); var data = new byte[PipeInBufferSize]; var count = pipeServer.Read(data, 0, PipeInBufferSize); if (count > 0) { // 通信双方可以约定好传输内容的形式,例子中我们传输简单文本信息。 string message = encoding.GetString(data, 0, count); Dispatcher.BeginInvoke(new Action(() => { tblRecMsg.Text = message; })); } } private void OnSend(object sender, RoutedEventArgs e) { if (_pipe.IsConnected) { try { string message = txtSendMsg.Text; byte[] data = encoding.GetBytes(message); _pipe.Write(data, 0, data.Length); _pipe.Flush(); _pipe.WaitForPipeDrain(); } catch { } } Close(); }

Client端:

UI:

    <Grid><Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Button Content="Connect" Margin="10" Click="OnConnect"/> <TextBlock Text="Received Message:" Grid.Row="1" Margin="10"/> <TextBlock x:Name="tblRecMsg" Grid.Row="1" Grid.Column="1"/> </Grid>

Code:

private const string PipeServerName = "PipeServer.exe"; private const string PipeName = "PipeSample"; private Encoding encoding = Encoding.UTF8; private NamedPipeClientStream _pipe; private bool _starting = false; public MainWindow() { InitializeComponent(); } private void OnConnect(object sender, RoutedEventArgs e) { if (_starting) { return; } var path = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, PipeServerName); var startInfo = new ProcessStartInfo(path) { UseShellExecute = false, CreateNoWindow = true }; try { var process = Process.Start(startInfo); _pipe = new NamedPipeClientStream ( ".", PipeName, PipeDirection.InOut, PipeOptions.Asynchronous | PipeOptions.WriteThrough ); _pipe.Connect(); _pipe.ReadMode = PipeTransmissionMode.Message; string message = "Connected!"; byte[] data = encoding.GetBytes(message); _pipe.BeginWrite(data, 0, data.Length, PipeWriteCallback, _pipe); _starting = true; } catch (Exception ex) { Debug.Write(ex.StackTrace); } } private void PipeWriteCallback(IAsyncResult ar) { var pipe = (NamedPipeClientStream)ar.AsyncState; pipe.EndWrite(ar); pipe.Flush(); pipe.WaitForPipeDrain(); var data = new byte[65535]; var count = pipe.Read(data, 0, data.Length); if (count > 0) { string message = encoding.GetString(data, 0, count); Dispatcher.BeginInvoke(new Action(() => { tblRecMsg.Text = message; })); } }

需要注意的地方:因为我们在同一台PC上面进行通信,我们只需要将 NamedPipeClientStream 构造参数中pipeServer设为"."即可。另外因为这只是一个示例,所以PipeServer中只传递简单String类型。当然也可以传递其他类型的内容。

运行效果:

感谢您的阅读!

转载于:https://www.cnblogs.com/yang-fei/p/4696689.html

C# NamePipe使用小结相关推荐

  1. 【阶段小结】协同开发——这学期的Git使用小结

    [阶段小结]协同开发--这学期的Git使用小结 一.Git简介 1. Git简单介绍 2. Git工作流程以及各个区域 3. Git文件状态变化 二.Git安装&Git基本配置 三.个人踩坑 ...

  2. 正则表达式(括号)、[中括号]、{大括号}的区别小结

    正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...

  3. php中$_REQUEST、$_POST、$_GET的区别和联系小结

    php中$_REQUEST.$_POST.$_GET的区别和联系小结 作者: 字体:[增加 减小] 类型:转载 php中有$_request与$_post.$_get用于接受表单数据,当时他们有何种区 ...

  4. c cin.get()的用法小结_c语言中static 用法

    static在c里面可以用来修饰变量,也可以用来修饰函数. 先看用来修饰变量的时候.变量在c里面可分为存在全局数据区.栈和堆里.其实我们平时所说的堆栈是栈而不是堆,不要弄混. int a ; int ...

  5. linux 压缩文件夹格式,Linux下常见文件格式的压缩、解压小结

    Linux下常见文件格式的压缩.解压小结 .tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ...

  6. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  7. flash 入门课知识小结

    一. 几种类型帧的小结:(关键帧.空白关键帧.普通帧) 1. 特点   帧--是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的每一帧都可以 ...

  8. Eigen/Matlab 使用小结

    文章目录 [Eigen Matlab使用小结](https://www.cnblogs.com/rainbow70626/p/8819119.html) Eigen初始化 0.[官网资料](http: ...

  9. MATLAB【十三】————仿真函数记录以及matlab变成小结

    part one:matlab 编程小结. 1.char 与string的区别,char使用的单引号 '' ,string使用的是双引号"". 2.一般标题中的输出一定要通过 nu ...

  10. oracle @spool,Oracle spool 用法小结

    Oracle spool 用法小结 转自:http://wallimn.javaeye.com/blog/472182 对于SPOOL 数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句 ...

最新文章

  1. Debug时含有的子元素,在代码里获取不到的问题
  2. 头像裁剪_课堂裁剪|19级油画班油画头像写生作品
  3. 条款9:不要在构造和析构过程中调用virtual函数
  4. 杭电2149Public Sale
  5. 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程
  6. 副业宝典~副业思维让你拥有更多钱
  7. 【Luat-air105】8.1 camera拍照
  8. 离合器膜片弹簧的优化设计matlab,基于matlab目标函数的建立优化离合器膜片弹簧的设计研究.doc...
  9. [产品设计]如何绘制业务流程图(上)
  10. 已知T(n)=2T(n/2)+n,求O(n)?
  11. 一步教会你如何上传资源到云服务器
  12. 我如何在GitHub Project上获得1,000个星星,以及在此过程中学到的教训
  13. 电脑增加机械硬盘计算机管理,电脑新增加一块硬盘安装并使用的教程
  14. Html+CSS+JS轮播图:手动轮播,自动轮播
  15. Composer 原理使用
  16. 【Pytorch安装】Failed building wheel for XXX踩坑
  17. 3d建模基础入门教程,3D建模各行业之间的发展趋势
  18. mt2503[SMS] 手机无法发出短信
  19. 在foxmail上添加阿里邮箱
  20. CF K. City

热门文章

  1. STM32的AD通道干扰问题
  2. CLR via C#深解笔记四 - 方法、参数、属性
  3. debian分区方案(就这个看着靠谱点)转
  4. JAVA笔记20-容器之四Map接口、自动打包、泛型(重要)
  5. 如何降低软件项目的风险 -- 包括客户的风险,软件提供商的风险
  6. E WORD 0410
  7. 133 MySQL视图、事务、索引(都很重要)
  8. MCS-51子程序库-1
  9. Go语言的一些使用心得
  10. SQL 存储过程 多条件 分页查询 性能优化