当前位置: 首页 > news >正文

C# 实现进程间通信的几种方式(完善)

目录

引言

一、基本概念

二、常见的IPC方法

1. 管道(Pipes)

2. 共享内存(Shared Memory)

3. 消息队列(Message Queues)

4. 套接字(Sockets)

5. 信号量(Semaphores)

6. 文件映射(File Mapping)

7. 远程过程调用(RPC)

三、总结


引言

进程间通信(IPC)是指在操作系统中,不同进程之间交换数据和信息的机制。在C#中,IPC可以通过多种方式实现,包括文件共享、命名管道、套接字、消息队列、远程过程调用(RPC)等。每种方法都有其特定的应用场景和优缺点。

一、基本概念

  1. 进程(Process)

    • 进程是操作系统中运行的程序实例。每个进程都有自己的内存空间、代码、数据和系统资源。进程之间相互独立,默认情况下无法直接访问彼此的内存空间。
  2. 进程间通信(IPC)

    • IPC允许进程共享资源、同步操作、传递消息等,是进程协作的基础。

二、常见的IPC方法

1. 管道(Pipes)

管道是一种半双工的通信机制,可以在同一台机器上的两个进程之间传输数据。包括匿名管道和命名管道。

应用场景: 常用于本地进程间的简单通信。

技术关键点: 数据流传输,适合父子进程。

// 服务器端
using (var serverPipe = new NamedPipeServerStream("testpipe", PipeDirection.InOut))
{Console.WriteLine("Waiting for client connection...");serverPipe.WaitForConnection(); // 等待客户端连接using (var reader = new StreamReader(serverPipe))using (var writer = new StreamWriter(serverPipe)){writer.WriteLine("Hello from server"); // 向客户端发送消息writer.Flush();string message = reader.ReadLine(); // 读取客户端发送的消息Console.WriteLine("Received from client: " + message);}
}// 客户端
using (var clientPipe = new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
{Console.WriteLine("Connecting to server...");clientPipe.Connect(); // 连接到服务器using (var reader = new StreamReader(clientPipe))using (var writer = new StreamWriter(clientPipe)){string message = reader.ReadLine(); // 读取服务器发送的消息Console.WriteLine("Received from server: " + message);writer.WriteLine("Hello from client"); // 向服务器发送消息writer.Flush();}
}

服务器端代码解释:

  • 创建一个命名管道服务器。
  • 等待客户端连接。
  • 使用StreamReaderStreamWriter进行数据读写。

客户端代码解释:

  • 创建一个命名管道客户端。
  • 连接到服务器。
  • 使用StreamReaderStreamWriter进行数据读写。

 

2. 共享内存(Shared Memory)

共享内存允许两个或多个进程访问同一块内存区域,是最快的IPC形式。

应用场景: 高性能要求的场景。

技术关键点: 内存同步,数据一致性。

// 使用MemoryMappedFile创建共享内存
using (var mmf = MemoryMappedFile.CreateNew("MyMap", 1024))
{using (var accessor = mmf.CreateViewAccessor()){// 准备数据byte[] data = new byte[1024];// 写入数据到共享内存accessor.WriteArray(0, data, 0, data.Length);// 读取数据accessor.ReadArray(0, data, 0, data.Length);}
}

代码解释:

  • 创建或打开一个共享内存对象。
  • 使用视图访问器来读写内存数据。
3. 消息队列(Message Queues)

消息队列允许进程通过发送和接收消息来通信,支持异步操作。

应用场景: 分布式系统,异步消息传递。

技术关键点: 消息持久化,异步处理。

// 发送消息
using (var queue = new MessageQueue(@".\Private$\MyQueue"))
{queue.Send("Hello, World!"); // 发送一条消息到队列
}// 接收消息
using (var queue = new MessageQueue(@".\Private$\MyQueue"))
{queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });var message = queue.Receive(); // 接收消息string content = (string)message.Body; // 读取消息内容Console.WriteLine(content);
}

代码解释:

  • 创建或打开一个消息队列。
  • 使用System.Messaging库发送和接收消息。

 

4. 套接字(Sockets)

套接字支持网络通信,可用于本地或远程进程间通信。

应用场景: 网络应用,实时通信。

技术关键点: 协议选择(TCP/UDP),数据传输稳定性。

// 服务器端
var listener = new TcpListener(IPAddress.Any, 5000);
listener.Start(); // 启动监听
Console.WriteLine("Waiting for connection...");
var client = listener.AcceptTcpClient(); // 接受客户端连接
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{writer.WriteLine("Hello from server"); // 发送消息给客户端writer.Flush();string message = reader.ReadLine(); // 读取客户端消息Console.WriteLine("Received from client: " + message);
}// 客户端
var client = new TcpClient();
client.Connect("localhost", 5000); // 连接到服务器
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{string message = reader.ReadLine(); // 读取服务器消息Console.WriteLine("Received from server: " + message);writer.WriteLine("Hello from client"); // 发送消息给服务器writer.Flush();
}

服务器端代码解释:

  • 创建一个TCP监听器。
  • 等待客户端连接。
  • 使用StreamReaderStreamWriter进行数据读写。

客户端代码解释:

  • 创建一个TCP客户端。
  • 连接到服务器。
  • 使用StreamReaderStreamWriter进行数据读写。

 

5. 信号量(Semaphores)

用于同步多个进程对共享资源的访问。

应用场景: 并发控制,资源管理。

技术关键点: 并发访问控制,资源锁定。

// 使用Semaphore进行进程同步Semaphore semaphore = new Semaphore(initialCount: 1, maximumCount: 1, name: "MySemaphore");semaphore.WaitOne(); // 请求访问共享资源// 执行临界区中的代码semaphore.Release(); // 释放共享资源

代码解释:

  • 创建或打开一个信号量对象。
  • 控制对共享资源的访问。

 

6. 文件映射(File Mapping)

允许进程将文件内容映射到内存中,实现数据共享。

应用场景: 文件共享,数据缓存。

技术关键点: 文件访问同步,内存映射效率。

// 使用FileStream和MemoryMappedFile进行文件映射
using (FileStream fs = new FileStream("data.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(fs, "MyMap", fs.Length, MemoryMappedFileAccess.ReadWrite, null, HandleInheritability.None, false)){using (var accessor = mmf.CreateViewAccessor()){accessor.Write(0, (byte)42); // 写入数据到映射文件Console.WriteLine(accessor.ReadByte(0)); // 读取数据}}
}

代码解释:

  • 使用FileStream打开一个文件。
  • 将文件内容映射到内存。
  • 使用视图访问器来读写内存数据。

 

7. 远程过程调用(RPC)

允许进程调用远程函数,提供分布式计算支持。

应用场景: 分布式系统,服务调用。

技术关键点: 调用序列化,网络通信可靠性。

// 定义服务契约
[ServiceContract]
public interface IMyService
{[OperationContract]string SayHello(string name);
}// 实现服务
public class MyService : IMyService
{public string SayHello(string name){return $"Hello, {name}!";}
}// 配置和托管服务
var host = new ServiceHost(typeof(MyService), new Uri("http://localhost:8000/MyService"));
host.AddServiceEndpoint(typeof(IMyService), new BasicHttpBinding(), "");
host.Open();
Console.WriteLine("Service is running... Press [Enter] to exit.");
Console.ReadLine();
host.Close();// 客户端调用
var factory = new ChannelFactory<IMyService>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/MyService"));
var proxy = factory.CreateChannel();
string result = proxy.SayHello("World"); // 调用远程服务
Console.WriteLine(result);
((IClientChannel)proxy).Close();
factory.Close();

服务器端实现步骤:

  • 定义服务契约。
  • 实现服务契约。
  • 使用WCF托管服务。

客户端实现步骤:

  • 创建服务契约的通道工厂。
  • 调用远程方法。

 

三、总结

进程间通信是C#中实现不同进程之间数据交换和信息传递的重要机制。常见的IPC方法包括文件共享、命名管道、套接字、消息队列和远程过程调用。每种方法都有其特定的应用场景和优缺点。

  • 文件共享: 简单易用,但性能较低,需要处理文件锁定和同步问题。
  • 命名管道: 支持双向通信,适用于局域网内的进程间通信。
  • 套接字: 支持跨网络通信,适用于TCP/IP或UDP协议的通信。
  • 消息队列: 支持异步通信和解耦合,适用于分布式系统。
  • 远程过程调用: 允许进程调用远程计算机上的函数或方法,适用于分布式应用。

通过合理选择和使用这些IPC方法,开发者可以实现高效、稳定且可扩展的进程间通信。了解每种方法的原理和应用场景,可以帮助开发者更好地设计和实现复杂的分布式系统。

相关文章:

C# 实现进程间通信的几种方式(完善)

目录 引言 一、基本概念 二、常见的IPC方法 1. 管道&#xff08;Pipes&#xff09; 2. 共享内存&#xff08;Shared Memory&#xff09; 3. 消息队列&#xff08;Message Queues&#xff09; 4. 套接字&#xff08;Sockets&#xff09; 5. 信号量&#xff08;Semaphore…...

MySQL Workbench Data Import Wizard:list index out of range

MySQL Workbench的Data Import Wizard功能是用python实现的&#xff0c;MySQL Workbench自带了一个python&#xff0c;数据导入的时候出现错误提示 22:55:51 [ERR][ pymforms]: Unhandled exception in Python code: Traceback (most recent call last): File "D…...

微信支付宝小程序SEO优化的四大策略

在竞争激烈的小程序市场中&#xff0c;高搜索排名意味着更多的曝光机会和潜在用户。SEO即搜索引擎优化&#xff0c;对于小程序而言&#xff0c;主要指的是在微信小程序商店中提高搜索排名&#xff0c;从而增加曝光度和用户访问量。有助于小程序脱颖而出&#xff0c;提升品牌知名…...

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion论文阅读笔记

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 论文阅读笔记 这是ECCV2024的论文&#xff0c;作者单位是是港中文和上海AI Lab 文章提出了一个叫AutoDIR的方法&#xff0c;包括两个关键阶段&#xff0c;一个是BIQA&#xff0c;基于vision-language…...

SQLite 数据库设计最佳实践

SQLite特点 SQLite是一款功能强大的 轻量级嵌入式数据库 ,具有以下显著特点: 体积小 :最低配置仅需几百KB内存,适用于资源受限环境。 高性能 :访问速度快,运行效率高于许多开源数据库。 高度可移植 :兼容多种硬件和软件平台。 零配置 :无需复杂设置,开箱即用。 自给自…...

【论文精读】ID-like Prompt Learning for Few-Shot Out-of-Distribution Detection

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 注&#xff1a;下文…...

Android 10.0 根据包名禁用某个app的home事件

1.前言 在10.0的系统rom定制化开发中,在某些app中,需要禁用home事件,在普通的app中又无法 禁用home事件,所以就需要从系统中来根据包名禁用home事件了,接下来分析下 系统中处理home事件的相关流程 2.根据包名禁用某个app的home事件的核心类 frameworks/base/services/c…...

Rust 文档生成与发布

目录 第三节 文档生成与发布 1. 使用 RustDoc 生成项目文档 1.1 RustDoc 的基本使用 1.2 文档注释的格式与实践 1.3 生成文档的其他选项 1.4 在 CI/CD 中生成文档 2. 发布到 crates.io 的步骤与注意事项 2.1 创建 crates.io 账户 2.2 配置 Cargo.toml 2.3 生成发布版…...

【C++动态规划】有效括号的嵌套深度

本文涉及知识点 C动态规划 LeetCode1111. 有效括号的嵌套深度 有效括号字符串 定义&#xff1a;对于每个左括号&#xff0c;都能找到与之对应的右括号&#xff0c;反之亦然。详情参见题末「有效括号字符串」部分。 嵌套深度 depth 定义&#xff1a;即有效括号字符串嵌套的层…...

2024年优秀的天气预测API

准确、可操作的天气预报对于许多组织的成功至关重要。 事实上&#xff0c;在整个行业中&#xff0c;天气条件会直接影响日常运营&#xff0c;包括航运、按需、能源和供应链&#xff08;仅举几例&#xff09;。 以公用事业为例。根据麦肯锡的数据&#xff0c;在 1.4 年的时间里…...

Android和iOS有什么区别?

Android 和 iOS 有以下区别&#xff1a; 开发者与所属公司&#xff1a; Android&#xff1a;由谷歌公司开发以及开放手机联盟维护。它是基于 Linux 内核和其他开源软件的修改版本&#xff0c;代码开源程度较高&#xff0c;许多厂商都可以基于 Android 源代码进行深度定制和开发…...

NVR小程序接入平台/设备EasyNVR多个NVR同时管理多平台级联与上下级对接的高效应用

政务数据共享平台的建设正致力于消除“信息孤岛”现象&#xff0c;打破“数据烟囱”&#xff0c;实现国家、省、市及区县数据的全面对接与共享。省市平台的“级联对接”工作由多级平台共同构成&#xff0c;旨在满足跨部门、跨层级及跨省数据共享的需求&#xff0c;推动数据流通…...

Spring Cloud Sleuth(Micrometer Tracing +Zipkin)

分布式链路追踪 分布式链路追踪技术要解决的问题&#xff0c;分布式链路追踪&#xff08;Distributed Tracing&#xff09;&#xff0c;就是将一次分布式请求还原成调用链路&#xff0c;进行日志记录&#xff0c;性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节…...

人工智能:机遇与挑战

人工智能&#xff08;AI&#xff09;作为当今世界科技发展的前沿领域&#xff0c;正在以前所未有的速度和规模影响着我们的生活和工作方式。AI技术的应用前景广阔&#xff0c;从医疗健康到金融服务&#xff0c;从教育到交通&#xff0c;再到娱乐和家庭生活&#xff0c;AI正在逐…...

mac电脑设置crontab定时任务,以及遇到的问题解决办法

crontab常用命令 crontab -u user&#xff1a;用来设定某个用户的crontab服务&#xff1b; crontab file&#xff1a;file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件&#xff0c;crontab命令将接受标准输入&#xf…...

Backtrader 数据篇 02

Backtrader 数据篇 本系列是使用Backtrader在量化领域的学习与实践&#xff0c;着重介绍Backtrader的使用。Backtrader 中几个核心组件&#xff1a; Cerebro&#xff1a;BackTrader的基石&#xff0c;所有的操作都是基于Cerebro的。Feed&#xff1a;将运行策略所需的基础数据…...

视频转场素材资源网站分享

视频剪辑者常常为找不到合适的转场素材而苦恼。合适的转场素材能让视频更流畅&#xff0c;给观众带来惊喜。下面就为大家介绍几个宝藏网站&#xff0c;提供丰富的转场剪辑素材&#xff0c;让你的视频瞬间高大上。 蛙学网 首先重磅推荐蛙学网&#xff0c;堪称视频素材界的“翘楚…...

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制&#xff08;Replication&#xff09;1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…...

基于OSS搭建在线教育视频课程分享网站

OSS对象存储服务是海量、安全、低成本、高持久的存储服务。适合于存储大规模非结构化数据&#xff0c;如图片、视频、备份文件和容器/虚拟机镜像等。 安装nginx wget https://nginx.org/download/nginx-1.20.2.tar.gz yum -y install zlib zlib-devel gcc-c pcre-devel open…...

CentOS 7 下升级 OpenSSL

升级openssh,下载&#xff1a;https://download.csdn.net/download/weimeilayer/89935114 上传到服务器&#xff0c;然后执行命令 rpm -Uvh *.rpm --nodeps --force安装依赖 yum -y install gcc perl make zlib-devel perl-CPAN下载安装包&#xff1a;https://github.com/ope…...

线上 Dump

优质博文&#xff1a;IT-BLOG-CN 一、简介 机器宕机或者请求很慢最常出现的几种问题&#xff1a;针对代码bug或者qps过高造成的。 【1】cpu过高致内存耗尽OOM&#xff0c;堆区对象回收不及时cpu被打满 【2】死锁抢用资源导致cpu过高致耗尽 【3】内存泄漏&#xff1a; 堆内存由…...

AcWing 1303:斐波那契前 n 项和 ← 矩阵快速幂加速递推

【题目来源】https://www.acwing.com/problem/content/1305/http://poj.org/problem?id3070【题目描述】 大家都知道 数列吧&#xff0c;。现在问题很简单&#xff0c;输入 和 &#xff0c;求 的前 项和 。【输入格式】 共一行&#xff0c;包含两个整数 和 。【输出格式】…...

2024 Rust现代实用教程:1.2编译器与包管理工具以及开发环境搭建

文章目录 一、Rust的编译器rustc二、开发环境搭建三、Rust的包管理工具Cargo四、项目结构1.Cargo.toml文件2.创建一个可执行文件项目3.创建一个库项目 参考 一、Rust的编译器rustc 查看版本 rustc-version编译生成二进制文件 rustc -o output filename filename.rs编译生成库…...

人工智能原理实验一:知识的表示与推理实验

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程&#xff0c;通过实验&#xff0c;帮助学生更好地掌握人工智能相关概念、技术、原理、应用等&#xff1b;通过实验提高学生编写实验报告、总结实验结果的能力&#xff1b;使学生对智能程序、智能算法等有…...

自学C语言——VS实用调试技巧总结

接上一篇&#xff1a;自学C语言——扫雷游戏&#xff08;无递归&#xff09; 什么是bug “bug”本意是昆虫或虫子&#xff0c;一般指电脑系统或程序中&#xff0c;隐藏着一些未被发现的缺陷或者问题&#xff0c;简称程序漏洞。 第一代的计算机是由许多庞大且昂贵的真空管组成&…...

VC2012创建弹出式菜单

首先为视类添加鼠标右键单击处理函数&#xff0c;添加如下代码&#xff0c; void CMFCApplication1View::OnRButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值CView::OnRButtonDown(nFlags, point);CMenu menu;menu.CreatePopupMenu…...

Google 第三季度季报出炉

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

入职总结(更新中)

【STEP 1/3】短信1之后&#xff1a;材料准备阶段 填写 新进教职工“入职一件事”线上办理 系统档案转递证明&#xff08;需档案到校&#xff09;&#xff1b; 档案&#xff1a;为规范管理&#xff0c;请拟报到人员将个人档案寄至浙江财经大学人事处&#xff0c;有专职人员进行…...

@DeleteMapping和@PostMapping和@GetMapping和Content-Type使用记录

代码例子&#xff0c;有注释大家可以自己试一下 RestController RequestMapping(value "demo") public class TestController {//Content-Type&#xff1a;application/x-www-form-urlencoded;表单提交form-dataPostMapping("/demo1")public String test…...

unity 中使用zeroMq和Mqtt 进行通讯

最近我在做一个车上的HMI项目&#xff0c;也就是车机应用&#xff0c;需要与云端和域控进行通信。HMI的功能已经外包了&#xff0c;但消息的统一层留给我自己来做。因为项目组其他人都没有经验&#xff0c;所以这个任务就落到了我头上&#xff0c;尽管我自己也没有太多经验&…...

淘客app网站是怎么做的/上海网站快速优化排名

文章目录前言一、uni-app环境配置1.下载HBuilderX2.安装 scss/sass 编译3.设置快捷键方案4.修改编辑器的基本设置前言 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。开发者编写一套代码&#xff0c;可发布到 iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/…...

用外链技术做视频网站/代做百度首页排名

重要&#xff1a;本文最后更新于2019-07-13 08:29:03&#xff0c;某些文章具有时效性&#xff0c;若有错误或已失效&#xff0c;请在下方留言或联系代码狗。PHP作为世界上最好的web语言&#xff0c;使用量是非常的大&#xff0c;学会它也许你会得到一门新的谋生手艺&#xff01…...

珠海专业网站制作公司/黑龙江今日新闻

什么是函数&#xff1f;函数就是在开发程序中结局问题的所采用的函数。在函数中函数与函数可以单独使用&#xff0c;也可以函数与函数相互调用。 函数能够解决什么问题&#xff1f;1.解决程序中代码过长&#xff08;如果一个程序需要写很多个相同的函数&#xff0c;那么就可以将…...

西安网站建设联系电话/代运营一般收费

1.首先指出&#xff0c;NF_HOOK系列宏的outdev参数的传递方式(直接传递一个net_device结构体指针)是不正确的正确的方式要么是不传递&#xff0c;要么是传递指针的地址&#xff0c;即地址的地址。2.接下来指出&#xff0c;仅仅传递一个地址为何不对因为在该HOOK点可能存在多个H…...

新光途网站建设/企业网站营销优缺点

这里之所以是查看下IP &#xff0c;是我们后面要建一个Centos远程工具Xshell 连接Centos的时候&#xff0c;需要IP地址&#xff0c;所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用户名root 密码 123456 然后我们输入ip查询命名 ip addr 发现ens33 …...

网站源码开发/日本网络ip地址域名

前言&#xff1a;今天开始开启一个新篇章的学习&#xff0c;那就是games101闫令琪老师讲的《现代计算机图形学入门》课程&#xff0c;我会根据闫老师每节课讲的内容记录重点笔记&#xff0c;每节课都会整理一篇发布出来&#xff0c;希望自己可以坚持下去&#xff0c;从图形学小…...