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

  • C#封装GRPC类库及调用简单实例已关闭评论
  • 130 次浏览
  • A+
所属分类:.NET技术
摘要

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

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

  • 1、创建并生成GRPC服务文件

(1)打开vs2022,创建新项目控制台应用(其他应用好像不行)。

(2)需要安装三个nuget包,如图:

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

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

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

(4)添加如下代码。测试实例为服务端和客户端传输字符串消息,所以博主只定义了一个方法(客户端调用,服务端重写),传输内容包括请求字符串和回复字符串。此处可自行定义。

proto
syntax = "proto3";  option csharp_namespace = "LinkService";  service Link { 	rpc GetMessage(Mes) returns (Mes); }  message Mes { 	string StrRequest = 1; 	string StrReply = 2; }

(5)右键Link.proto文件选择属性,生成操作选择如图:

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

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

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

至此,获得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类中定义如下:

public static Func<string, string> ReplyMes;

1)在LinkServerFunc类重写GetMessage方法如下:

LinkServerFunc
 using Grpc.Core; using LinkService; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static LinkService.Link;  namespace GrpcLink {     public class LinkServerFunc : LinkBase     {         public override Task<Mes> GetMessage(Mes request, ServerCallContext context)         {             Mes mes = new Mes();             mes.StrReply = LinkFunc.ReplyMes(request.StrRequest);             return Task.FromResult(mes);         }     } }

2)开始写LinkFunc类。

LinkFunc
 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项目。

 窗体:

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

窗体代码:

TestServer
 using GrpcLink; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;  namespace TestServer {     public partial class FormServer : Form     {         public FormServer()         {             InitializeComponent();             LinkFunc.LinkServerStart("127.0.0.1", 9008);             LinkFunc.ReplyMes = ReplyMes;         }          public string ReplyMes(string strRequest)         {             Invoke(new Action(() => { tbReply.Text = strRequest; }));                          string reply = tbRequest.Text;             return reply;         }     } }

 (3)客户端TestCilent项目。

 窗体:

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

窗体代码:

TestCilent
 using GrpcLink; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;  namespace TestCilent {     public partial class FormCilent : Form     {         public FormCilent()         {             InitializeComponent();             LinkFunc.LinkClientStart("127.0.0.1:9008");         }          private void btnSend_Click(object sender, EventArgs e)         {             string strmes = tbRequest.Text;             string strres = LinkFunc.SendMes(strmes);             tbReply.Text = strres;         }     } }

 (4)运行两个项目进行测试。

在客户端的发送区输入要发送的内容。

在服务端的回复区输入要回复的内容。

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

点击发送:

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