使用命名管道进程之间通信(转)

原文地址:http://www.cnblogs.com/yukaizhao/archive/2011/08/04/system-io-pipes.html

命名管道:

命名管道的功能比匿名管道更强大,可以在进程之间做双工通信(即通信的两个进程都是既可以读也可写的);命名管道也可以实现跨网络在不同机器之间进行通信。可以在多线程中创建多个NamedPipeServerStream实例,为多个client端服务。另外命名管道还支持消息传输,这样client端可以读取任意长度的消息,而无须知道消息的长度。

服务端代码:

//服务端 发送消息
//创建命名管道实例
using (NamedPipeServerStream serverStream = new NamedPipeServerStream("testpipe"))
{
    //等待连接
    serverStream.WaitForConnection();
    using (StreamWriter writer = new StreamWriter(serverStream))
    {
        writer.AutoFlush = true;
        string temp;
        while ((temp = Console.ReadLine()) != "stop")
        {
            writer.WriteLine(temp);
        }
    }
}

客户端代码:

//客户端读取数据
using (NamedPipeClientStream clientStream = new NamedPipeClientStream("testpipe"))
{
    //开启连接
    clientStream.Connect();
    using (StreamReader reader = new StreamReader(clientStream))
    {
        string temp;
        while ((temp = reader.ReadLine()) != "stop")
        {
            Console.WriteLine("{0}:{1}", DateTime.Now, temp);
        }
    }
}

上面代码执行结果是服务端输入文本,客户端显示接受到文本的时间和文本内容。上面说了命名管道是全双工通信的,所以你也可以让客户端写内容,而服务端接受内容,代码大同小异。

基于消息传输的命名管道:

基于消息的命名管道可以传递不定长的内容,而无需传递内容长度或者结束符,上面非基于消息的传输我们都是在向管道中输入一段文本,使用WriteLine方法以回车换行作为结束符传输信息,而管道的另一端再使用ReadLine方法以读取到回车换行符作为一个消息传递结束的标志;而在使用基于消息传输时就不必这么做了。如下示例:

服务端代码:

//服务端发送消息
UTF8Encoding encoding = new UTF8Encoding();
string message1 = "Named Pipe Message Example";
string message2 = "Another Named Pipe Message Example.";

byte[] bytes;
using (NamedPipeServerStream serverStream =
    new NamedPipeServerStream("messagepipe2", PipeDirection.InOut, 1,
    PipeTransmissionMode.Message, PipeOptions.None))
{
    serverStream.WaitForConnection();

    //发送消息
    bytes = encoding.GetBytes(message1);
    serverStream.Write(bytes, 0, bytes.Length);
    bytes = encoding.GetBytes(message2);
    serverStream.Write(bytes, 0, bytes.Length);
}

客户端代码:

//客户端读取消息
Decoder decoder = Encoding.UTF8.GetDecoder();
byte[] bytes = new byte[10];
char[] chars = new char[10];
using (NamedPipeClientStream clientStream = new NamedPipeClientStream("messagepipe2"))
{
    clientStream.Connect();
    clientStream.ReadMode = PipeTransmissionMode.Message;
    //将二进制转换成字符串
    int numBytes;
    do
    {
        string message = "";
        do
        {
            numBytes = clientStream.Read(bytes, 0, bytes.Length);
            int numChars = decoder.GetChars(bytes, 0, numBytes, chars, 0);
            message += new string(chars, 0, numChars);
        } while (!clientStream.IsMessageComplete);
        decoder.Reset();
        Console.WriteLine(message);
    } while (numBytes != 0);
}
时间: 2024-10-08 08:19:27

使用命名管道进程之间通信(转)的相关文章

命名管道进程通信

命名管道进程通信 效果:server读取client发送的字符串. server: client: control: 运行效果 命名管道进程通信

IPC进程之间通信的几种方式

概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件. 除此以外,那就是双方都可以访问的 外设 了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率

进程与进程之间通信Manager

1 #!/usr/bin/env python 2 from multiprocessing import Process,Manager 3 4 #Manager进程与进程之间通信 5 def Foo(i,dic): 6 dic[i] = 100+i 7 print(dic.values()) 8 if __name__ == '__main__': 9 manage = Manager() 10 dic = manage.dict() 11 for i in range(2): 12 p =

进程之间通信之有名管道、无名管道(pipe),笔记

             进程之间的通信作用1.数据传输   :一个进程需要将他的数据传到其他进程2.资源共享3.进程通知事件4.进程控制 :有些进程完全控制另一个进程的执行,如调试状态啊我们需要完全控制他的每一步操作: 通信发展历史Linux进程间的通信IPC由以下几个部分发展而来:1.UNIX进程之间的通信2.基于system v进程间的通信3.POSIX进程之间的通信(portable operating system interface) 现在Linux使用的进程间的通信方式包括:1.管

linux程序设计——pipe调用在两进程之间通信(第十三章)

13.4    pipe调用 在看过高级的popen函数之后,再来看看底层的pipe函数.通过这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令.它同时提供了对读写数据的更多控制. pipe函数的原型如下所示: #include <unistd.h> int pipe(int file_descriptor[2]); 参数:是一个由两个整数类型的文件描述符组成的数组. 返回值:该函数在数组中填上两个新的文件描述符,如果成功则返回0,如果失败则返回-1并设置errno来表明失

生产者消费者模型,管道,进程之间共享内存,进程池

课程回顾: 并行:在同一时间点上多个任务同时执行 并发:在同一时间段上多个任务同时执行 进程的三大基本状态: 就绪状态:所有进程需要的资源都获取到了,除了CPU 执行状态:获取到了所有资源包括CPU,进程处于运行状态 阻塞状态:程序停滞不在运行,放弃CPU,进程此时处于内存里 什么叫进程? 正在运行的程序 有代码段,数据段,PCB(进程控制块) 进程是资源分配的基本单位. 进程之间能不能直接通信? 正常情况下,多进程之间是无法进行通信的.因为每个进程都有自己独立的空间 锁: 为了多进程通信时,保

信号量实现进程之间通信

一.信号量 信号量是一种数据操作锁,本身不具有数据交换功能,而是通过控制其他的通信资源来实现进程之间的通信,简单来讲,信号量相当于一个计数器,计数当前某种资源的个数.信号量的周期也是随内核的.为了解决多个程序同时访问一个共享资源引发的问题. 临界资源:多个进程能访问到的公共资源. 临界区:将能访问带临界资源的代码成为临界区. 同步:对临界资源的访问具有顺序性. pv 操作 p(sv)  sv>0 减1  sv=0   挂起的该进程执行 s(sv)  没有进程因等待sv而挂起就加1,有进程等待sv

进程之间通信

IPC 指的是进程间通讯 之所以开启子进程 ,肯定需要他帮我们完成任务,很多情况下,需要将数据返回给父进程. 然而进程内存是物理隔离的 解决方案: 1.将共享数据放在文件中,就是慢 2.管道 subprocess 中那个管道只能单向通讯,必须有父子关系 3.共享一块内存区域 得操作系统帮你分配,速度快 第三钟实现Manager from multiprocessing import Process,Manager import time def task(dic): print("子进程&quo

跨进程(同一app不同进程之间通信)——Android自动化测试学习历程

视频地址:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877122&courseId=712011 一.问题: 1.如何做到一个app不同进程通信? 2.多个app通信(不同app) 3.注入事件运行脚本和调用隐藏api 二.一个app不同进程通信: 知识点: 1.Intent.binder 2.Service.Activity 3.Handler.view 4.Messeng