翼度科技»论坛 编程开发 .net 查看内容

C#封装GRPC类库及调用简单实例

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
一个简单的C#实例。包括:GRPC文件的创建生成、服务端和客户端函数类库的封装、创建服务端和客户端调用测试。若有错误或更好的方法还请指正。

  • 1、创建并生成GRPC服务文件
(1)打开vs2022,创建新项目控制台应用(其他应用好像不行)。
(2)需要安装三个nuget包,如图:

(3)项目添加新建项,选择类,修改名称为Link.proto,添加后把内容全部删除。

(4)添加如下代码。测试实例为服务端和客户端传输字符串消息,所以博主只定义了一个方法(客户端调用,服务端重写),传输内容包括请求字符串和回复字符串。此处可自行定义。
proto
  1. syntax = "proto3";
  2. option csharp_namespace = "LinkService";
  3. service Link
  4. {
  5.         rpc GetMessage(Mes) returns (Mes);
  6. }
  7. message Mes
  8. {
  9.         string StrRequest = 1;
  10.         string StrReply = 2;
  11. }
复制代码
(5)右键Link.proto文件选择属性,生成操作选择如图:

(6)生成解决方案。在下图路径得到自动生成的两个类。

至此,获得GRPC服务需要的三个文件:Link.proto、Link.cs、LinkGrpc.cs。可以将这三个文件放在一个项目中直接使用,需要重写一下服务端方法、创建服务端和客户端的启动方法。但是如果不同的项目软件之间通讯需要各自如此开发。可以先封装成一个GRPC类库供其他项目直接调用。

  • 2、服务端和客户端函数类库的封装

(1)vs2022创建类库(.NET Framework)项目。
项目添加现有项,上面获得的三个文件。安装nuget包:Grpc.Core和Google.Protobuf。
(2)此处创建两个类:LinkFunc用于放此类库可用于外部引用调用的方法。LinkServerFunc基于Link.LinkBase,用于重写在proto文件中定义的方法。
对于不同的项目,在客户端请求时,服务端要根据自身情况回复想回的内容,因此可以提供一个委托供外部自行开发回复函数。
在LinkFunc类中定义如下:
  1. public static Func<string, string> ReplyMes;
复制代码
1)在LinkServerFunc类重写GetMessage方法如下:
LinkServerFunc
  1.  using Grpc.Core;
  2. using LinkService;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using static LinkService.Link;
  9. namespace GrpcLink
  10. {
  11.     public class LinkServerFunc : LinkBase
  12.     {
  13.         public override Task<Mes> GetMessage(Mes request, ServerCallContext context)
  14.         {
  15.             Mes mes = new Mes();
  16.             mes.StrReply = LinkFunc.ReplyMes(request.StrRequest);
  17.             return Task.FromResult(mes);
  18.         }
  19.     }
  20. }
复制代码
2)开始写LinkFunc类。
LinkFunc
  1.  using Grpc.Core;using LinkService;using System;using System.Collections.Generic;using System.Linq;using System.Net.Mail;using System.Text;using System.Threading.Tasks;using static LinkService.Link;namespace GrpcLink{    public class LinkFunc    {        // 用于服务端回复委托        public static Func<string, string> ReplyMes;        // 定义服务端和客户端        public static Server LinkServer;        public static LinkClient LinkClient;        // 服务端启动        public static void LinkServerStart(string host, int port)        {            LinkServer = new Server            {                Services =                    {                        BindService(new LinkServerFunc())                    },                Ports = { new ServerPort(host, port, ServerCredentials.Insecure) }            };            LinkServer.Start();        }        // 服务端关闭        public static void LinkServerClose()        {            LinkServer?.ShutdownAsync().Wait();        }        // 客户端启动        public static void LinkClientStart(string strIp)        {            Channel prechannel = new Channel(strIp, ChannelCredentials.Insecure);            LinkClient = new LinkClient(prechannel);        }        // 客户端发送消息函数        public static string SendMes(string strRequest)        {            Mes mes = new Mes();            mes.StrRequest = strRequest;            var res = LinkClient.GetMessage(mes);            return res.StrReply;        }    }}
复制代码
(3)生成解决方案。Debug中可以得到项目的dll文件GrpcLink.dll,其他项目可以引用使用了。

  •  3、创建服务端和客户端调用测试。
(1)vs2022创建两个Windows窗体应用(.NET Framework)项目。将上述GrpcLink.dll文件分别放入两个项目中,并添加dll引用。安装nuget包:Grpc.Core和Google.Protobuf。
(2)服务端TestServer项目。
 窗体:

窗体代码:
TestServer
  1.  using GrpcLink;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace TestServer
  12. {
  13.     public partial class FormServer : Form
  14.     {
  15.         public FormServer()
  16.         {
  17.             InitializeComponent();
  18.             LinkFunc.LinkServerStart("127.0.0.1", 9008);
  19.             LinkFunc.ReplyMes = ReplyMes;
  20.         }
  21.         public string ReplyMes(string strRequest)
  22.         {
  23.             Invoke(new Action(() => { tbReply.Text = strRequest; }));
  24.             
  25.             string reply = tbRequest.Text;
  26.             return reply;
  27.         }
  28.     }
  29. }
复制代码
 (3)客户端TestCilent项目。
 窗体:

窗体代码:
TestCilent
  1.  using GrpcLink;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace TestCilent
  12. {
  13.     public partial class FormCilent : Form
  14.     {
  15.         public FormCilent()
  16.         {
  17.             InitializeComponent();
  18.             LinkFunc.LinkClientStart("127.0.0.1:9008");
  19.         }
  20.         private void btnSend_Click(object sender, EventArgs e)
  21.         {
  22.             string strmes = tbRequest.Text;
  23.             string strres = LinkFunc.SendMes(strmes);
  24.             tbReply.Text = strres;
  25.         }
  26.     }
  27. }
复制代码
 (4)运行两个项目进行测试。
在客户端的发送区输入要发送的内容。
在服务端的回复区输入要回复的内容。

点击发送:


 

来源:https://www.cnblogs.com/wtc87/archive/2022/12/24/17002800.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具