c# IPC实现本机进程之间的通信

简介: 原文:c# IPC实现本机进程之间的通信  IPC可以实现本地进程之间通信。这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通信。
原文: c# IPC实现本机进程之间的通信

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

  应用包含:

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

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

  1 1:新建一个MessageObject类库
  2  
  3 代码如下:
  4  
  5 using System;
  6 using System.Collections.Generic;
  7  
  8 namespace MessageObject
  9 {
 10     //MarshalByRefObject 允许在支持远程处理的应用程序中跨应用程序域边界访问对象。
 11     public class RemoteObject : MarshalByRefObject
 12     {
 13         public static Queue<string> qMessage { get; set; } //使用消息队列储存消息
 14  
 15         public string SendMessage(string message)
 16         {
 17             if (qMessage == null)
 18             {
 19                 qMessage = new Queue<string>();
 20             }
 21             qMessage.Enqueue(message);
 22  
 23             return message;
 24         }
 25     }
 26 }
 27 2:新建一个控制台程序,名称:IPCServer,是IPC的服务端
 28 using System;
 29 using System.Runtime.Remoting.Channels.Ipc;
 30 using System.Runtime.Remoting.Channels;
 31 using System.Runtime.Remoting;
 32 using MessageObject;
 33 using System.Threading;
 34 using System.Collections.Generic;
 35  
 36 namespace IPCServer
 37 {
 38     /// <summary>
 39     /// IPC Server
 40     /// </summary>
 41     class Program
 42     {
 43         static void Main(string[] args)
 44         {
 45             StartServer();
 46  
 47             Thread t = new Thread(new ThreadStart(ReceviceMessage));  //使用线程获取消息
 48             t.Start();
 49         }
 50         private static void StartServer()
 51         {
 52             IpcServerChannel channel = new IpcServerChannel("ServerChannel");
 53             ChannelServices.RegisterChannel(channel, false);
 54             RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "RemoteObject", WellKnownObjectMode.SingleCall);
 55             Console.WriteLine("message server running...");
 56         }
 57         private static void ReceviceMessage()
 58         {
 59             while (true)
 60             {
 61                 Queue<string> qMessage = RemoteObject.qMessage;
 62                 if (qMessage != null)
 63                 {
 64                     if (qMessage.Count > 0)
 65                     {
 66                         string message = qMessage.Dequeue();
 67                         Console.WriteLine("recevice message is:"   message);
 68                     }
 69                 }
 70                 Thread.Sleep(1000);  //每一秒获取一次
 71             }
 72         }
 73  
 74     }
 75 }
 76 3:新建一个控制台程序,名称:IPCClient,IPC客户端
 77 代码如下:
 78 using System;
 79 using MessageObject;
 80 using System.Runtime.Remoting.Channels.Ipc;
 81 using System.Runtime.Remoting.Channels;
 82  
 83 namespace IPCClient
 84 {
 85     class Program
 86     {
 87         static void Main(string[] args)
 88         {
 89             RemoteObject objRemoteObject = ConnectServer();
 90             Send(objRemoteObject);
 91         }
 92         private static void Send(RemoteObject objRemoteObject)
 93         {
 94             while (true)
 95             {
 96                 Console.WriteLine("please input message...");
 97                 string message = Console.ReadLine();
 98                 try
 99                 {
100                     objRemoteObject.SendMessage(message);
101                     Console.WriteLine("send success");
102                 }
103                 catch (System.Runtime.Remoting.RemotingException)
104                 {
105                     Console.WriteLine("can not connect message server");
106                 }
107             }
108         }
109         private static RemoteObject ConnectServer()
110         {
111             IpcClientChannel channel = new IpcClientChannel();
112             ChannelServices.RegisterChannel(channel, false);
113             RemoteObject objRemoteObject = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "ipc://ServerChannel/RemoteObject");
114             return objRemoteObject;
115         }
116     }
117 }
View Code

  使用技巧:

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

 1     public class MyProcessSendObject : MarshalByRefObject
 2     {
 3         private string taskInfo = string.Empty;
 4 
 5         public void Add(string taskInfo)
 6         {
 7             Console.WriteLine("Add:{0}", taskInfo);
 8             this.taskInfo = taskInfo;
 9         }
10 
11         public string GetTask()
12         {
13             Console.WriteLine("GetTask:{0}", taskInfo);
14             return taskInfo;
15         }
16 
17     }

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

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

13 Console.WriteLine("press Enter to exit"); 14 Console.ReadLine(); 15 Console.WriteLine("server stopped"); 16 }

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

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("I'm client......");
 4             IpcChannel tcc = new IpcChannel();
 5             ChannelServices.RegisterChannel(tcc, false);
 6 
 7             MyProcessSendObject myObj = (MyProcessSendObject)Activator.GetObject(typeof(MyProcessSendObject), "ipc://testchannel/myObj");
 8             
 9             Console.WriteLine("client send myvalue start");
10             myObj.Add("Task 1");
11             myObj.GetTask();
12             myObj.Add("Task 2");
13             myObj.GetTask();
14             Console.WriteLine("client send myvalue complete");
15             Console.ReadLine();
16         }

工程结构:

测试:

 

目录
相关文章
|
22天前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
38 10
|
15天前
|
消息中间件 Python
深入理解操作系统的进程间通信(IPC)机制
本文将探讨操作系统中的核心概念——进程间通信(IPC),揭示其在系统运作中的重要性及实现方式。通过分析不同类型的IPC手段,如管道、信号、共享内存等,帮助读者更好地理解操作系统的内部工作原理及其在实际应用中的表现。
23 1
|
20天前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
117 4
|
21天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
14 3
|
23天前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
45 5
|
23天前
|
消息中间件 Kafka 数据安全/隐私保护
Python IPC实战指南:构建高效稳定的进程间通信桥梁
【9月更文挑战第11天】在软件开发中,随着应用复杂度的提升,进程间通信(IPC)成为构建高效系统的关键。本文通过一个分布式日志处理系统的案例,介绍如何使用Python和套接字实现可靠的IPC。案例涉及定义通信协议、实现日志发送与接收,并提供示例代码。通过本教程,你将学会构建高效的IPC桥梁,并了解如何根据需求选择合适的IPC机制,确保系统的稳定性和安全性。
36 5
|
20天前
|
消息中间件 Unix
操作系统的心脏:深入理解进程间通信(IPC)
在现代计算中,操作系统扮演着至关重要的角色,它不仅管理着硬件资源,还负责协调和优化应用程序之间的交互。本文将深入探讨操作系统中的一个核心概念——进程间通信(IPC),揭示其背后的机制以及在实际应用中的重要性。通过通俗易懂的语言和条理清晰的解释,本文旨在为读者提供一个关于IPC的全面了解,从基本定义到高级应用,带领大家走进操作系统的神秘世界。
|
25天前
|
消息中间件 网络协议 Python
工具人逆袭!掌握Python IPC,让你的进程从此告别单打独斗
【9月更文挑战第9天】你是否曾遇到多个Python程序像孤岛般无法通信,导致数据孤立、任务难协同的问题?掌握进程间通信(IPC)技术,可助你打破这一僵局。IPC是不同进程间传递数据或信号的机制,在Python中常用的方法有管道、消息队列、共享内存及套接字等。其中,管道适用于父子或兄弟进程间简单数据传递;套接字则不仅限于本地,还能在网络间实现复杂的数据交换。通过学习IPC,你将能设计更健壮灵活的系统架构,成为真正的编程高手。
20 3
|
26天前
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
23 4
|
25天前
|
消息中间件 数据库 Python
深度剖析!Python IPC的奥秘,带你走进进程间通信的微观世界
【9月更文挑战第8天】在编程世界中,进程间通信(IPC)是连接不同程序或进程的关键技术,使数据在独立进程间自由流动,构建复杂软件系统。本文将深入探讨Python中的IPC机制,包括管道、消息队列、套接字等,并通过具体示例展示如何使用Socket实现网络IPC。Python的`multiprocessing`模块还提供了队列、管道和共享内存等多种高效IPC方式。通过本文,你将全面了解Python IPC的核心概念与应用技巧,助力开发高效协同的软件系统。
39 2