C#中使用命名管道进行进程通信的实例

简介: 原文: C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为“Windows 应用程序”。
+关注继续查看
原文: C#中使用命名管道进行进程通信的实例

新建解决方案NamedPipeExample

在解决方案下面新建两个项目:ClientServer,两者的输出类型均为“Windows 应用程序”。整个程序的结构如下图所示。

 

 

实现项目Client

Client仅包含一个名为“客户端”的窗体,如下图所示。

 

编写窗体后端代码,如下所示。

using System;
using System.IO;
using System.IO.Pipes;
using System.Security.Principal;
using System.Windows.Forms;
 
namespace Client
{
    public partial class frmClient : Form
    {
        NamedPipeClientStream pipeClient =
            new NamedPipeClientStream("localhost", "testpipe", PipeDirection.InOut, PipeOptions.Asynchronous, TokenImpersonationLevel.None);
        StreamWriter sw = null;
 
        public frmClient()
        {
            InitializeComponent();
        }
 
        private void frmClient_Load(object sender, EventArgs e)
        {
            try
            {
                pipeClient.Connect(5000);
                sw = new StreamWriter(pipeClient);
                sw.AutoFlush = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("连接建立失败,请确保服务端程序已经被打开。");
                this.Close();
            }
        }
 
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (sw != null)
            {
                sw.WriteLine(this.txtMessage.Text);
            }
            else
            {
                MessageBox.Show("未建立连接,不能发送消息。");
            }
        }
    }
}

实现项目Server

Server项目仅包含一个名为“服务端”的窗体,如下图所示。

 

编写窗体后端代码,如下所示。

using System;
using System.IO;
using System.IO.Pipes;
using System.Threading;
using System.Windows.Forms;
 
namespace Server
{
    public partial class frmServer : Form
    {
        NamedPipeServerStream pipeServer =
            new NamedPipeServerStream("testpipe", PipeDirection.InOut,1,PipeTransmissionMode.Message,PipeOptions.Asynchronous);
        public frmServer()
        {
            InitializeComponent();
        }
 
        private void frmServer_Load(object sender, EventArgs e)
        {
            ThreadPool.QueueUserWorkItem(delegate
            {
                pipeServer.BeginWaitForConnection((o) => 
                {
                    NamedPipeServerStream pServer = (NamedPipeServerStream)o.AsyncState;
                    pServer.EndWaitForConnection(o);
                    StreamReader sr = new StreamReader(pServer);
                    while (true)
                    {
                        this.Invoke((MethodInvoker)delegate { lsvMessage.Items.Add(sr.ReadLine()); });
                    }
                }, pipeServer);
            });
        }
    }
}
 

运行程序

运行Server.exeClient.exe程序,效果如下图所示。

 

实例中共发送三次消息,分别传递数据1,2,3

本例中演示的客户端和服务端程序均位于本地机器,使用命名管道可以与网络上的其他进程进行通信。

目录
相关文章
|
3月前
|
消息中间件 Unix Linux
Linux进程间通信【匿名管道和命名管道】
Linux进程间通信,包括匿名管道和命名管道的原理、操作及实现,两种管道实现进程池等丰富内容,详细讲解,干货满满!
71 2
Linux进程间通信【匿名管道和命名管道】
|
5月前
|
消息中间件 Unix Linux
进程间通信之管道(匿名管道与命名管道)
首先我们先提出一个问题:进程之间为什么无法直接通信,而需要操作系统提供通信方式: 经过我们上一个博客学习我们可以知道,每个进程都有独立的虚拟地址空间,一个进程在访问一个数据的时候都是通过地址来进行访问的,进过页表映射在之后访问物理内存,因此如果想要给另一个进程传递一个数据,就要把它的地址空间传递给其他进程,因为a进程的是虚拟地址,所以b进程经过页表映射也访问不了。(这个设计的初衷是:独立虚拟空间可以更稳定)
48 0
|
8月前
|
Linux Shell
【Linux进程间通信】三、FIFO命名管道
【Linux进程间通信】三、FIFO命名管道
73 0
【Linux进程间通信】三、FIFO命名管道
|
消息中间件 存储 算法
【Linux】进程间通信 —— 匿名管道 | 命名管道 | System V | 共享内存
本文重点:进程间通信宏观认识;匿名管道;命名管道;共享内存;信号量(多线程)
388 0
【Linux】进程间通信 —— 匿名管道 | 命名管道 | System V | 共享内存
进程间通信:命名管道
一、命名管道(FIFO) 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。 命名管道可以从命令行上创建,命令行方法是使用下面这个命令:$ mkfifo filename命名管道也可以从程序里创建,相关函数有:int mkfifo(const char *filename,mode_t mode);   二、命名管道和匿名管道 匿名管道由pipe函数创建并打开。
954 0
|
C# Windows
C#命名管道通信
原文:C#命名管道通信 C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI、发消息等。但在Windows下面发消息需要有窗口,我们的程序是一个后台运行程序,发消息不试用。RMI又用的太多了,准备用管道通信来做消息通信。
1131 0
|
Linux 安全 Shell
IPC——命名管道
Linux进程间通信——使用命名管道 转载:http://blog.csdn.net/ljianhui/article/details/10202699 在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。
1092 0
|
Linux
管道和命名管道
命名管道(named PIPE) 由于基于fork机制,所以管道只能用于父进程和子进程之间,或者拥有相同祖先的两个子进程之间 (有亲缘关系的进程之间)。为了解决这一问题,Linux提供了FIFO方式连接进程。
916 0
|
Linux C++ 安全
Linux进程间通信——使用命名管道
在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。
1110 0
相关产品
云迁移中心
推荐文章
更多