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

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

1 新建解决方案NamedPipeExample

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

2 实现项目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("未建立连接,不能发送消息。");
            }
        }
    }
}

3 实现项目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);
            });
        }
    }
}
 

4 运行程序

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

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

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

时间: 2024-10-05 23:27:20

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

命名管道跨进程通信实例1(转)

原文地址:http://www.cnblogs.com/yukaizhao/archive/2011/08/08/namedpipeserverstream-example.html 本文介绍命名管道使用实例,文中例子是几个客户端都通过一台服务器获得新生成的int类型id. 服务器端功能:当客户端请求一个新的id时,将现有id自增1,然后返回给客户端. 服务器端实现:在程序启动时,启动n个线程,在每个线程中都声明一个NamedPipeServerStream的实例,并循环的WaitForConn

命名管道跨进程通信实例2(转)

原文:http://www.cnblogs.com/jonneydong/archive/2012/03/02/2418743.html 服务端代码: //创建服务端,管道实例 NamedPipeServerStream serverStream = new NamedPipeServerStream("test2PIPE", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);

linux中的命名管道(FIFO)

管道只能用于亲缘关系之间的通信,而FIFO中,只要可以访问路径,就可以进行通信. FIFO按照先进先出的原则进行通信,第一个被写入的数据首先从管道中读出. 创建命名管道的系统函数有两个: mknod和mkfifo.两个函数均定义在头文件sys/stat.h,函数原型如下: #include <sys/types.h>#include <sys/stat.h>int mknod(const char *path,mode_t mod,dev_t dev);int mkfifo(con

C#中使用SendMessage进行进程通信的实例

原文:C#中使用SendMessage进行进程通信的实例 1 新建解决方案SendMessageSecondExample 在解决方案下面新建两个项目:Sender和Receiver,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Sender Sender仅包含一个名为"消息发送者"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.Diagnostics; using

利用命名管道实现进程间的通信(简单聊天程序的实现)

管道的本质是一种文件,通常是指把一个进程的输出直接传递给另一个进程的输入. 命名管道(named pipe)是一种特殊的文件类型(FIFO文件),它在文件系统中以文件名的形式存在. 下面是Linux中命名管道的文件格式: 通过命令行创建命名管道可以通过mkfifo命令,函数调用如下所示: 1 #include <sys/types.h> 2 #include <sys/stat.h> 3 4 int mkfifo(const char *filename,mode_t mode);

linux中的命名管道FIFO

匿名管道pipe前面已经说过了,接下来就说命名管道FIFO: 我们可以使用以下函数之一来创建一个命名管道,他们的原型如下:#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *filename, mode_t mode);int mknod(const char *filename, mode_t mode | S_IFIFO, (dev_t)0);这两个函数都能创建个FIFO,   注意是创建一个真实存

邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#

邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系统所需要编写的代码非常少.如果读者是项目经理,就可以给你手下每一位员工的机器上安装上这个系统中的邮槽服务器端程序,在你自己的机器上安装油槽的客户端程序,这样,当你想通知员工开会,就可以通过自己安装的邮槽客户端程序.将开会这个消息发送出去,因为机器上都安装了邮槽服务器端的程序,所以他们都能同时收到你发

[操作系统实验]使用命名通道实现进程通信

实验目的和要求 了解windows系统环境下的进程通信机制 熟悉windows系统提供的进程通信API 完成两个进程之间的通信,需要建立两个工程文件,在Microsoft Visual C++ 6. 0环境下建立服务器工程文件PipeServer和客户端工程文件PipeClient.在服务器程序中,首先使用CreateNamedPipe()创建-一个命名管道,之后使用ConnectNamedPipe()连接命名管道,如果命名管道连接成功,可以使用读文件函数ReadFile()从命名管道中读数据,

Android中的跨进程通信方法实例及特点分析(二):ContentProvider

1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据.比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能). 这种优点是统一管理,比方添加了某个音频文件,底层就会将这种变化通知Content Provider.从而当应用程序訪问