IPC可以实现本地进程之间通信。这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通信。虽然不常见但也避免不了一些场景会使用该方案。

  应用包含:

1)使用IPC技术实现多client与一个sever通信(不过是本机,感觉意义不大,但如果想实现本机上运行确实是一个不错的方案);

2)使用IPC技术实现订阅者和生产者分离时,一个server接收并消费消息,客户端是生产消息的。

 :新建一个MessageObject类库

 代码如下:

 using System;
using System.Collections.Generic; namespace MessageObject
{
//MarshalByRefObject 允许在支持远程处理的应用程序中跨应用程序域边界访问对象。
public class RemoteObject : MarshalByRefObject
{
public static Queue<string> qMessage { get; set; } //使用消息队列储存消息 public string SendMessage(string message)
{
if (qMessage == null)
{
qMessage = new Queue<string>();
}
qMessage.Enqueue(message); return message;
}
}
}
:新建一个控制台程序,名称:IPCServer,是IPC的服务端
using System;
using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
using MessageObject;
using System.Threading;
using System.Collections.Generic; namespace IPCServer
{
/// <summary>
/// IPC Server
/// </summary>
class Program
{
static void Main(string[] args)
{
StartServer(); Thread t = new Thread(new ThreadStart(ReceviceMessage)); //使用线程获取消息
t.Start();
}
private static void StartServer()
{
IpcServerChannel channel = new IpcServerChannel("ServerChannel");
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "RemoteObject", WellKnownObjectMode.SingleCall);
Console.WriteLine("message server running...");
}
private static void ReceviceMessage()
{
while (true)
{
Queue<string> qMessage = RemoteObject.qMessage;
if (qMessage != null)
{
if (qMessage.Count > )
{
string message = qMessage.Dequeue();
Console.WriteLine("recevice message is:" message);
}
}
Thread.Sleep(); //每一秒获取一次
}
} }
}
:新建一个控制台程序,名称:IPCClient,IPC客户端
代码如下:
using System;
using MessageObject;
using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting.Channels; namespace IPCClient
{
class Program
{
static void Main(string[] args)
{
RemoteObject objRemoteObject = ConnectServer();
Send(objRemoteObject);
}
private static void Send(RemoteObject objRemoteObject)
{
while (true)
{
Console.WriteLine("please input message...");
string message = Console.ReadLine();
try
{
objRemoteObject.SendMessage(message);
Console.WriteLine("send success");
}
catch (System.Runtime.Remoting.RemotingException)
{
Console.WriteLine("can not connect message server");
}
}
}
private static RemoteObject ConnectServer()
{
IpcClientChannel channel = new IpcClientChannel();
ChannelServices.RegisterChannel(channel, false);
RemoteObject objRemoteObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "ipc://ServerChannel/RemoteObject");
return objRemoteObject;
}
}
}

  使用技巧:

1)使用之间必须定义好一个进程之间通信的对象(该对象继承了MarshalByRefObject ,允许在支持远程处理的应用程序中跨应用程序域边界访问对象);

     public class MyProcessSendObject : MarshalByRefObject
{
private string taskInfo = string.Empty; public void Add(string taskInfo)
{
Console.WriteLine("Add:{0}", taskInfo);
this.taskInfo = taskInfo;
} public string GetTask()
{
Console.WriteLine("GetTask:{0}", taskInfo);
return taskInfo;
} }

2)服务端是发布了一个IPC服务,供客户端段来绑定使用;

         //I PC(inter process communication)的功能可以实现同一台机器上的不同进程间通信。
static void Main(string[] args)
{
Console.WriteLine("I'm server......");
//Instantiate our server channel.
IpcChannel serverchannel = new IpcChannel("testchannel");
//Register the server channel.
ChannelServices.RegisterChannel(serverchannel, false);
//Register this service type.
RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyProcessSendObject), "myObj", WellKnownObjectMode.Singleton);

Console.WriteLine("press Enter to exit");
Console.ReadLine();
Console.WriteLine("server stopped");
}

3)客户端使用时需要绑定服务端发布的地址,之后获取发布的对象(暂时可以这么理解:数据的传递和同步是通过对象序列化、反序列化),在客户端操作该对象时实际上是操作了服务端的对象。

         static void Main(string[] args)
{
Console.WriteLine("I'm client......");
IpcChannel tcc = new IpcChannel();
ChannelServices.RegisterChannel(tcc, false); MyProcessSendObject myObj = (MyProcessSendObject)Activator.GetObject(typeof(MyProcessSendObject), "ipc://testchannel/myObj"); Console.WriteLine("client send myvalue start");
myObj.Add("Task 1");
myObj.GetTask();
myObj.Add("Task 2");
myObj.GetTask();
Console.WriteLine("client send myvalue complete");
Console.ReadLine();
}

工程结构:

测试:

c# IPC实现本机进程之间的通信的更多相关文章

  1. 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池

    一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...

  2. python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726

    进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...

  3. 进程之间的通信(multiprocess.Queue)

    一.进程间通信 进程之间的数据是相互隔离的,例如 from multiprocessing import Process def task(): global n # 声明全局变量 n = 999 p ...

  4. day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信

    day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...

  5. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  6. UNIX标准C - 进程之间的通信

    一.基本概念 进程间通信IPC:进程之间交换数据的过程叫进程间通信 进程间同性的方式: 简单的进程间的通信: 命令行:父进程通过exec函数创建子进程是可以附加一些数据 环境变量表:父进程通过exec ...

  7. python网络编程中互斥锁与进程之间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  8. Linux_进程之间的通信

    一.进程间的通信 1️⃣:进程间通信(IPC:Inter Process Communication) 2️⃣:进程之间通信方式: 同一主机 共享内存 信号:Signal 不同主机 rpc:remot ...

  9. python进程之间的通信——Queue

    我们知道进程之间的数据是互不影响的,但有时我们需要在进程之间通信,那怎么办呢? 认识Queue 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息 ...

随机推荐

  1. 解决python本地离线安装requests问题

    使用python36进行本地requests安装的时候,由于安装requests需要联网,导致安装失败,现象如下: 一开始以为,需要安装什么证书,其实只是需要一个python的证书库,(⊙﹏⊙)b 执 ...

  2. 使用jitpack来获取github上的开源项目

    在开发中我们需要经常使用第三方依赖库,在构建工具Gradle或maven中声明依赖, 大部分使用的是maven中心仓库或者阿里云仓库等等,但是这样也存在一个问题,上述仓库的库虽然简单快捷好用,但并不是 ...

  3. WinSock 异步I/O模型-3

    重叠I/O(Overlapped I/O) 在 Winsock 中,重叠 I/O(Overlapped I/O)模型能达到更佳的系统性能,高于之前讲过的三种.重叠模型的基本设计原理便是让应用程序使用一 ...

  4. MongoDB系列二(介绍).

    一.特点 学习一个东西,至少首先得知道它能做什么?适合做什么?有什么优缺点吧? 传统关系型数据库,遵循三大范式.即原子性.唯一性.每列与主键直接关联性.但是后来人们慢慢发现,不要把这些数据分散到多个表 ...

  5. python基础学习笔记二之列表

    1.列表 ①列表的创建: ②列表的查询(索引): ③列表的切片操作: 此处要注意到:返回索引0到3的元素,顾头不顾尾. ④列表的增加: s.append()  #直接在结尾追加 s.insert()  ...

  6. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

  7. 浅谈 JSON.stringify 方法

    一.前言 最近项目中,遇到需要将对象转换成字符串进行传递,上次写过一篇文章关于json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值.当时主要是用在有时候处理字符串和 ...

  8. C++ STL 容器之栈的使用

    Stack 栈是种先进后出的容器,C++中使用STL容器Stack<T> 完美封装了栈的常用功能. 下面来个demo 学习下使用栈的使用. //引入IO流头文件 #include<i ...

  9. GLES2学习VBO和VAO的使用

    在GLES2中使用VBO和VAO对象,已经简单vs,ps绘制一个三角形. 1. 初始化操作代码,创建VBO.VAO,编译和链接shader program. void DebugApplication ...

  10. iPhone的App嵌入html页面问题

    测试环境:iPhone ios 11.0.3 问题:iPhone App嵌入HTML页面,页面拉动到底部时,手势从屏幕底部边缘开始往上拉动,页面出现白色图层,且html页面一屏外的会卡住,无法滚动,需 ...