c# IPC实现本机进程之间的通信
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实现本机进程之间的通信的更多相关文章
- 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池
一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...
- python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726
进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...
- 进程之间的通信(multiprocess.Queue)
一.进程间通信 进程之间的数据是相互隔离的,例如 from multiprocessing import Process def task(): global n # 声明全局变量 n = 999 p ...
- day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信
day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...
- Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
- UNIX标准C - 进程之间的通信
一.基本概念 进程间通信IPC:进程之间交换数据的过程叫进程间通信 进程间同性的方式: 简单的进程间的通信: 命令行:父进程通过exec函数创建子进程是可以附加一些数据 环境变量表:父进程通过exec ...
- python网络编程中互斥锁与进程之间的通信
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- Linux_进程之间的通信
一.进程间的通信 1️⃣:进程间通信(IPC:Inter Process Communication) 2️⃣:进程之间通信方式: 同一主机 共享内存 信号:Signal 不同主机 rpc:remot ...
- python进程之间的通信——Queue
我们知道进程之间的数据是互不影响的,但有时我们需要在进程之间通信,那怎么办呢? 认识Queue 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息 ...
随机推荐
- Python sort后赋值 操作陷阱
x=[1,4,2,0] # 错误的方式,因为sort没有返回值 y=x.sort() type (y) #NoneType #正确的方式 x.sort() y=x[:]
- TPYBoard v102 DIY照相机(视频和制作流程)
前段时间的帖子,利用TPYBoard v102做的DIY照相机,周末实物终于做出来了,加了两个按键模块和一个5110,做的有点糙啊----望大家勿怪,哈哈哈.拍出来图片还算清晰,串口摄像头模块用的30 ...
- Redis的事务和watch
redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...
- 在Node应用中避免“Dot Hell”
转载自:http://blog.leapoahead.com/2015/09/03/prevent-node-require-dot-hell/ 在Node应用中,我们使用require来加载模块.在 ...
- PAT-L3-球队“食物链”-dfs-状压-set
题目分析: 1. 一场双循环赛制的篮球赛,注意双循环,双循环! 2. 共有n只球队,两两之间有胜有负有平局: 3. 输入: 举例: 第一行:W:代表球队1打赢过这只队伍 L:代表球队2没打赢过这只队伍 ...
- 微信APP长按图片禁止保存到本地
项目遇到一个问题,在web页面中,禁止长按图片保存, 使用css属性: img { pointer-events: none; } 或者 img { -webkit-user-select: no ...
- 打造Linux回收站
linux是没有回收站概念的,一旦误删除文件了是很难很难找回来的,对普通用户而言误删除文件就等于永久性不可逆丢失数据了:不过可以改造一下rm命令来变相实现回收站功能,实际上就是mv命令转移文件到指定路 ...
- java排序算法(六):直接插入排序
java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1 ...
- java开源安全框架-------Apache Shiro--第一天
1.1.简介 Apache Shiro 是Java的一个安全框架.目前使用Apache Shiro 的人越来越多,因为它相当简单,对比Spring Security,可能没有没有Spring Secu ...
- oracle管理权限和角色
介绍 这一部分主要看看oracle中如何管理权限和角色,权限和角色的区别在哪里. 当刚刚建立用户时,用户没有任何权限,也不能执行任何操作.如果要执行某种特定的数据库操作,则必需为其授予系统的权限:如果 ...