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

04 使用gRPC实现客户端和服务端通信

使用gRPC实现客户端和服务端通信

参考文档:

基于C#的GRPC

1 创建项目和文件夹

GrpcClientDemoGrpcServerDemoProtos解决方案和文件夹

1.1 添加nuget依赖

客户端和服务器都要有依赖和gRPC_Objects文件夹

 <ItemGroup><PackageReference Include="Google.Protobuf" Version="3.25.2" /><PackageReference Include="Grpc" Version="2.46.6" /><PackageReference Include="Grpc.Core" Version="2.46.6" /><PackageReference Include="Grpc.Tools" Version="2.46.6"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference></ItemGroup><ItemGroup><Protobuf Include="../Protos/*.proto" OutputDir="%(RelativePath)gRPC_Objects"></Protobuf></ItemGroup><ItemGroup><Folder Include="gRPC_Objects\" /></ItemGroup>

1.2 添加hello.proto

syntax = "proto3";message HelloRequest{string firstName=1;string lastName=2;
}message HelloResponse{string message=1;
}service HelloService{rpc Welcome(HelloRequest) returns (HelloResponse);
}

编译会自动生成代码

2 创建服务端代码

GServices/HelloServiceImpl.cs

using Grpc.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static HelloService;namespace GrpcServerDemo.GServices
{public class HelloServiceImpl:HelloServiceBase{public override Task<HelloResponse> Welcome(HelloRequest request, ServerCallContext context){var message = $"你好 {request.FirstName} {request.LastName}";return Task.FromResult(new HelloResponse { Message = message });                          //return base.Welcome(request, context);}}
}

Program.cs

using Grpc.Core;
using GrpcServerDemo.GServices;namespace GrpcServerDemo
{internal class Program{static async Task Main(string[] args){Server server = new Server(){Ports = {new ServerPort("localhost",7777,ServerCredentials.Insecure)},Services = {HelloService.BindService(new HelloServiceImpl())}               };try{server.Start();Console.WriteLine($"server is listening to port 7777");Console.ReadKey();}catch (Exception ex){Console.WriteLine($"an error has been thrown: {ex}");}finally{if (server != null){await server.ShutdownAsync();}}}}
}

3 创建客户端代码

Program.cs


using Grpc.Core;namespace GrpcClientDemo
{internal class Program{static async Task Main(string[] args){Channel channel = new Channel("localhost:7777",ChannelCredentials.Insecure);try{await  channel.ConnectAsync();Console.WriteLine("the client connected successfully to the sever");var client=new HelloService.HelloServiceClient(channel);HelloResponse helloResponse = await client.WelcomeAsync(new HelloRequest{FirstName="xie",LastName="万能"});Console.WriteLine("接受到数据:"+helloResponse.Message);Console.ReadKey();}catch (Exception ex){Console.WriteLine($"an error has been thrown: {ex}");}finally{if(channel != null){await channel.ShutdownAsync();}}}}
}
http://www.lryc.cn/news/296339.html

相关文章:

  • 设计模式-行为型模式(下)
  • 华为交换机常用命令
  • 【Linux】信号-上
  • uniapp 开发App 权限授权 js-sdk
  • 【01】判断素数/质数(C语言)
  • 特征工程:特征提取和降维-上
  • 前端JavaScript篇之强类型语言和弱类型语言的区别和对比
  • [红日靶机渗透] ATKCK红队评估实战靶场三
  • 网课:N皇后问题——牛客(题解和疑问)
  • [大厂实践] Netflix容器平台内核panic可观察性实践
  • 2024/2/8
  • Verilog刷题笔记23
  • C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度
  • opencv C++ dnn模块调用yolov5以及Intel RealSense D435深度相机联合使用进行目标检测
  • 2024牛客寒假算法基础集训营1(视频讲解全部题目)
  • 第三百一十三回
  • 倒计时61天
  • npm后Truffle找不到命令(ubantu20系统)
  • 嵌入式学习第三篇——51单片机
  • RabbitMQ详解
  • CGAL::2D Arrangements-4
  • 终端命令提示符:如何查看我们电脑端口是否被占用和处理方式
  • elasticsearch重置密码操作
  • 从零开始手写mmo游戏从框架到爆炸(零)—— 导航
  • 机器学习7-K-近邻算法(K-NN)
  • 相机图像质量研究(7)常见问题总结:光学结构对成像的影响--镜片固化
  • 猫头虎分享已解决Bug || Go Error: cannot convert int to string
  • 前端bug手册
  • Elasticsearch中Document Routing特性
  • 【Git版本控制 03】远程操作