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. Algorithm --> 两个栈实现队列和两个队列实现栈

    两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如 ...

  2. java必学的5种排序算法

    第一种冒泡排序 第二种 选择排序 第三种.插入排序

  3. Object类-----java

    Object类是所有类的父类,如果一个类没有使用extends关键字明确标识继承另一个类,那么这类默认继承object类 Object类中的方法,适合所有子类. 1 toString()方法在Obje ...

  4. sqlserver 简单的创建数据库

    简简单单,作为不是牛逼的程序来说,这是很容易忘记的sql语句: use mastergo --判断是否存在该数据库if exists(select *from Sysdatabases where n ...

  5. lua对多个精灵执行一系列动作,延时失效

    function MainPlayerCards:sendCards() local winSize = cc.Director:getInstance():getWinSize() local nS ...

  6. c# 实时监控数据库 SqlDependency

    http://blog.csdn.net/idays021/article/details/49661855 class Program { private static string _connSt ...

  7. 如何防止cookie被串改

    在这里我不想多说怎么去操作cookie了,网上博文一大堆,大家可以去自行搜索,在这里也是记录一下自己的知识,以便以后方便查阅.当我们在浏览器地址栏输入地址成功打开网页以后,服务器会把一些信息写入coo ...

  8. JS常见操作,日期操作,字符串操作,表单验证等

    复制代码 //第一篇博文,希望大家多多支持 /***** BasePage.js 公共的 脚本文件 部分方法需引用jquery库 *****/ //#region 日期操作 //字符串转化为时间. f ...

  9. NOIP知识点

    基础算法 贪心 枚举 分治 二分 倍增 高精度 模拟 图论 图 最短路(dijkstra.spfa.floyd) 最小生成树(kruskal.prim) 并查集 拓扑排序 二分图染色 Tarjan 树 ...

  10. iOS开发-OC分支结构

     BOOL类型 返回值:真:YES  假:NO BOOL数据类型占一个字节的内存空间,占位符为%d. 计算机在识别时,YES就替换成1,NO就替换成0. bool是C语言中的布尔类型,返回值为true ...