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. 20165230 2017-2018-2 《Java程序设计》第2周学习总结

    20165230 2017-2018-2 <Java程序设计>第2周学习总结 教材学习内容总结 本周学习了JAVA中的数据类型.数组.运算符.表达式和语句,与C语言很类似,二者也有区别. ...

  2. 20165230 《Java程序设计》第1周学习总结

    20165230 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 本周通过学习了解了java的历史,地位,特点以及java的应用和基本的开发步骤,对Java有 ...

  3. 笔记:Maven Web项目

    生成Web项目模块 生成Web项目模板和生成其他项目的模板一致,差别是指定模板的类型,执行命令如下: mvn archetype:generate -DarchetypeArtifactId=mave ...

  4. 从分布式一致性到共识机制(一)Paxos算法

    从分布式系统的CAP理论出发,关注分布式一致性,以及区块链的共识问题及解决. 区块链首先是一个大规模分布式系统,共识问题本质就是分布式系统的一致性问题,但是又有很大的不同.工程开发中,认为系统中存在故 ...

  5. nginx域名跳转技巧

    1.地址重写:访问server_name的时候跳转到http://www.cnblogs.com/qinyujie/ 修改nginx配置文件.加入到server{...}字段或者location字段里 ...

  6. 以太坊开发DApp入门教程——区块链投票系统(一)

    概述 对初学者,首先要了解以太坊开发相关的基本概念.   学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...

  7. node.js与比特币(typescript实现)

    BTC中的utxo模型 BTC中引入了许多创新的概念与技术,区块链.PoW共识.RSA加密.萌芽阶段的智能合约等名词是经常被圈内人所提及,诚然这些创新的实现使得BTC变成了一种有可靠性和安全性保证的封 ...

  8. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

  9. springboot集成mybatisplus

    介绍: Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生.(摘自mybatis-plus官网)Mybati ...

  10. 新手使用mac上的textedit写HTML时遇到的问题及解决办法

    刚开始在mac上学习HTML,总结一下遇到的问题和解决办法 问题:使用textedit编写html,在网页上却仍然显示的是代码. 解决办法: 打开textedit后打开文本编辑 选择偏好设置 按如图所 ...