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本身是一个消息 ...
随机推荐
- 笔记:Spring Cloud Eureka 服务治理
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...
- sublime安装、注册、插件
1. sublime下载:http://www.sublimetext.com/3 2. 输入注册码: help->Enter License —– BEGIN LICENSE —– Antho ...
- Docker学习笔记(一)
什么是Docker? 1.基于Go语言开发的云开源项目,Docker的主要目标是通过对应用组件的 封装,分发,部署,运行等生命周期的管理,达到应用组件级别的 一次封装,到处运行. 2.可以将Docke ...
- 【Python】 list & dict & str
list & dict & str 这三种类型是python中最常用的几种数据类型.他们都是序列的一种 ■ 序列通用操作 1. 分片 s[a:b] 返回序列s中从s[a]到s[b- ...
- [css 揭秘]:CSS揭秘 技巧(一):半透明边框
我的github地址:https://github.com/FannieGirl/ifannie/ 源码都在上面哦 喜欢的给我一个星吧 半透明边框 css 中的半透明颜色,比如用 rgba() 和 h ...
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- 上海依图-电话面试-angularjs
树的遍历(树结构:node.name,node.children),输出node.name(递归) 指令的scope的绑定策略(@绑定DOM数学单向绑定:=双向数据绑定:&绑定父作用域函数) ...
- 网络1711班 C语言第一次作业批改总结
Testing 总结 1 本次作业评分规则 1.1 基本要求(1分) 按时交 - 有分 未交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 0分 博客作业格式不规范,没有用Markdown语 ...
- 安利给班里的大家一个chrome的GitHub插件-----gayhub
title: 一个好用的Github插件--gayhub date: 2017-09-20 15:41:36 tags: --- 别跑, 这真是正经插件. 效果, 一图流: 具体效果在项目地址很详细 ...
- node.js基础
//安装淘宝npm镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org//require表示引包,引包就是引用自己的一个特 ...