首页 > 系统相关 >C# 实现 gRPC 进程间通讯:两台设备的数据交换之道

C# 实现 gRPC 进程间通讯:两台设备的数据交换之道

时间:2025-01-10 21:00:26浏览次数:3  
标签:Console C# gRPC using new 数据交换 客户端

标题:C#上位机通信救星!gRPC助力打造高效稳定通信架构,告别传统通信泥潭!

引言:

作为一名C#上位机开发老鸟,你是否还在为以下问题焦头烂额?

  • 两台工控机之间数据交互慢如蜗牛,实时性?不存在的!
  • 进程间通信代码堪比天书,调试维护?想哭!
  • 传统通信方式面对高并发、大数据量直接躺平,性能?呵呵!

别慌,gRPC驾到,专治各种通信不服!

什么是gRPC?

gRPC是一个由Google开源的高性能、开源、通用的RPC框架,基于HTTP/2协议,采用Protocol Buffers作为接口描述语言。它拥有以下优势:

  • 高性能: 基于HTTP/2的多路复用、头部压缩等特性,传输效率极高。
  • 跨平台: 支持多种编程语言和平台,方便不同系统之间的集成。
  • 简单易用: 使用IDL定义服务接口,代码自动生成,开发效率高。
  • 功能强大: 支持双向流、身份验证、负载均衡等高级特性。

gRPC在C#上位机编程中的实战应用:

1. 环境准备

  • 安装.NET SDK 5.0或更高版本。
  • 安装Visual Studio 2019或更高版本。
  • 安装protoc编译器。

2. 定义gRPC服务

创建一个名为service.proto的文件,定义服务接口和消息类型:

syntax = "proto3";

option csharp_namespace = "GrpcService";

package greet;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

3. 生成C#代码

使用protoc编译器将.proto文件编译成C#代码:

protoc --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin service.proto

这将生成两个文件:Service.csServiceGrpc.cs

4. 实现gRPC服务

创建一个新的C#类库项目,并将生成的Service.csServiceGrpc.cs文件添加到项目中。然后,实现GreeterBase类:

using Grpc.Core;
using System.Threading.Tasks;

namespace GrpcService
{
    public class GreeterService : Greeter.GreeterBase
    {
        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply
            {
                Message = "Hello " + request.Name
            });
        }
    }
}

5. 创建gRPC服务器

创建一个新的控制台应用程序项目,并添加对gRPC服务类库项目的引用。然后,创建gRPC服务器:

using Grpc.Core;
using GrpcService;
using System;

namespace GrpcServer
{
    class Program
    {
        const int Port = 50051;

        public static void Main(string[] args)
        {
            Server server = new Server
            {
                Services = { Greeter.BindService(new GreeterService()) },
                Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
            };

            server.Start();

            Console.WriteLine("Greeter server listening on port " + Port);
            Console.WriteLine("Press any key to stop the server...");
            Console.ReadKey();

            server.ShutdownAsync().Wait();
        }
    }
}

6. 创建gRPC客户端

创建另一个控制台应用程序项目,并添加对gRPC服务类库项目的引用。然后,创建gRPC客户端:

using Grpc.Core;
using GrpcService;
using System;
using System.Threading.Tasks;

namespace GrpcClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);

            var client = new Greeter.GreeterClient(channel);

            var reply = await client.SayHelloAsync(new HelloRequest { Name = "World" });
            Console.WriteLine("Greeting: " + reply.Message);

            await channel.ShutdownAsync();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

7. 运行程序

  • 首先运行gRPC服务器程序。
  • 然后运行gRPC客户端程序。

客户端将向服务器发送请求,并接收服务器的响应。

8. 部署到两台设备

将gRPC服务器程序部署到一台设备,将gRPC客户端程序部署到另一台设备。确保两台设备能够通过网络互相访问。

9. 修改客户端连接地址

在客户端程序中,将Channel的地址修改为服务器设备的IP地址和端口号。

10. 运行程序

  • 在服务器设备上运行gRPC服务器程序。
  • 在客户端设备上运行gRPC客户端程序。

客户端将向服务器发送请求,并接收服务器的响应。

总结:

gRPC作为一种现代化的通信框架,为C#上位机编程带来了全新的解决方案。它能够有效解决传统通信方式存在的各种问题,帮助开发者构建高效、稳定、易维护的通信系统。

行动起来,拥抱gRPC,开启高效通信新时代!

博文中的代码仅供参考,最好的教程还是官方的示例程序,附录是教程资源,有兴趣的同学可以学习学习。
附录:

希望这篇博客能够帮助您更好地理解和应用gRPC技术!

标签:Console,C#,gRPC,using,new,数据交换,客户端
From: https://blog.csdn.net/hujingbo1234/article/details/145003129

相关文章

  • C api简单查询需要的几步
    Capi查询简单需要的几步1.准备sql语句2.绑定变量通过sqlstatement类bindout方法将查询出来的值与存储他们的变量绑定。这里绑定是为了以后从结果集中提取一行时只需要一行就可以完成将提取出来的变量赋值。3.执行execute在这一步将sql语句执行。在这里有几个重点mysql_qu......
  • [LangChain 视频学习资源一览]
    如果你对LangChain感兴趣,并计划通过YouTube视频自学,那么这里整理了一份截至2024年5月16日的LangChain官方和相关教程资源清单。这些视频内容丰富、深度适中,涵盖从入门到进阶的多个主题,是学习构建基于大语言模型(LLM)应用的绝佳资料。官方LangChainYouTube......
  • UART/SPI/I2C 协议——(1)三者区别
    1. UART,SPI,I2C区别汇总特性UARTSPII2C通信方式串行、异步通信串行、同步通信串行、同步通信传输速率较低(9600-115200bps)高速(通常超过1Mbps)较慢(通常在100kbps到400kbps)引脚数量2根(TX和RX)4根(MOSI,MISO,SCLK,CS)2根(SDA,SCL)连接方式点对点通信主从模式(1主与......
  • 【C++】穿越编程岁月,细品C++进化轨迹,深化入门基石(续章)——揭秘函数缺省参数的魅力、函
    文章目录一、函数缺省参数二、函数重载三、引用1.引用的概念和定义2.引用的特性3.引用的使用4.const引用5.指针和引用的关系四、inline内联函数和nullptr1.inline2.nullptr一、函数缺省参数   缺省参数其实就是默认参数,它是声明或定义函数时为函数的参数指定......
  • 【C++】揭开C++类与对象的神秘面纱(首卷)(类的基础操作详解、实例化艺术及this指针的深
    文章目录一、类的定义1.类定义格式2.类访问限定符3.类域二、类的实例化1.实例化概念2.对象的大小三、隐藏的this指针与相关练习1.this指针的引入与介绍练习1练习2练习3一、类的定义1.类定义格式   在讲解类的作用之前,我们来看看类是如何定义的,在C++中,class......
  • C# 两大线程本地存储解决方案:ThreadStatic 与 ThreadLocal
    C#两大线程本地存储解决方案:ThreadStatic与ThreadLocal一、线程本地存储在C#中,static关键字定义的变量,其作用域是在应用程序域(AppDomain)内共享的。因此,在多线程操作时,对同一个静态变量进行操作可能会导致并发问题,如锁竞争等。这种情况下,我们需要一种机制,使某些变量对每个......
  • AT_abc248_h [ABC248Ex] Beautiful Subsequences 题解
    题目传送门前置知识树状数组|序列分治解法考虑序列分治,设因\(\max\)和\(\min\)形成的分节点先后为\(k_{1},k_{2}\)。对于\(j\in(mid,k_{1}]\),等价于统计满足\(\max\limits_{h=i}^{mid}\{a_{h}\}-\min\limits_{h=i}^{mid}\{a_{h}\}\lej-i+k\)的\(j\)的......
  • exGCD
    FileintGCD(inta,intb){ if(b==0)returna; returnGCD(b,a%b);}Question01[贝祖定理]根据ax+by=GCD(a,b)a,b均为正整数求x,y的整数值。Solution因为ax+by=GCD(a,b)并且GCD(a,b)=GCD(b,a%b)所以ax+by=GCD(b,a%b)由贝祖定理GCD(b,a%b)=bX+a%bY我们求出x,y和下......
  • C语言分支和循环(上)
    分⽀和循环分⽀和循环(上)1.if语句1.1if1.2else2.关系操作符3.条件操作符4.逻辑操作符:&&,||,!5.switch语句分⽀和循环(上)C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇......
  • 安装Fedora提示“Warning: /dev/root does not exist, could not boot”
    方法一:1.首先U盘启动,选择安装centos7,一直等,最终进入命令行:dracut:#dracut:#cd/devdracut:/dev#ls查看你的U盘,一般是第二块硬盘sdb4。如果还不确定,记下sdb3之后的几块盘,就拔出U盘,ls几次看看少了哪一个盘,一般就看不到sdb4了,如果看不到sdb4了,那我们的U盘就是sdb4,否则......