淺析C#封裝GRPC類庫及調(diào)用簡單實例
一個簡單的C#實例。包括:GRPC文件的創(chuàng)建生成、服務(wù)端和客戶端函數(shù)類庫的封裝、創(chuàng)建服務(wù)端和客戶端調(diào)用測試。若有錯誤或更好的方法還請指正。
1、創(chuàng)建并生成GRPC服務(wù)文件
(1)打開vs2022,創(chuàng)建新項目控制臺應用(其他應用好像不行)。
(2)需要安裝三個nuget包,如圖:
(3)項目添加新建項,選擇類,修改名稱為Link.proto,添加后把內(nèi)容全部刪除。
(4)添加如下代碼。測試實例為服務(wù)端和客戶端傳輸字符串消息,所以博主只定義了一個方法(客戶端調(diào)用,服務(wù)端重寫),傳輸內(nèi)容包括請求字符串和回復字符串。此處可自行定義。
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文件選擇屬性,生成操作選擇如圖:
(6)生成解決方案。在下圖路徑得到自動生成的兩個類。
至此,獲得GRPC服務(wù)需要的三個文件:Link.proto、Link.cs、LinkGrpc.cs??梢詫⑦@三個文件放在一個項目中直接使用,需要重寫一下服務(wù)端方法、創(chuàng)建服務(wù)端和客戶端的啟動方法。但是如果不同的項目軟件之間通訊需要各自如此開發(fā)??梢韵确庋b成一個GRPC類庫供其他項目直接調(diào)用。
2、服務(wù)端和客戶端函數(shù)類庫的封裝
(1)vs2022創(chuàng)建類庫(.NET Framework)項目。
項目添加現(xiàn)有項,上面獲得的三個文件。安裝nuget包:Grpc.Core和Google.Protobuf。
(2)此處創(chuàng)建兩個類:LinkFunc用于放此類庫可用于外部引用調(diào)用的方法。LinkServerFunc基于Link.LinkBase,用于重寫在proto文件中定義的方法。
對于不同的項目,在客戶端請求時,服務(wù)端要根據(jù)自身情況回復想回的內(nèi)容,因此可以提供一個委托供外部自行開發(fā)回復函數(shù)。
在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 { // 用于服務(wù)端回復委托 public static Func<string, string> ReplyMes; // 定義服務(wù)端和客戶端 public static Server LinkServer; public static LinkClient LinkClient; // 服務(wù)端啟動 public static void LinkServerStart(string host, int port) { LinkServer = new Server { Services = { BindService(new LinkServerFunc()) }, Ports = { new ServerPort(host, port, ServerCredentials.Insecure) } }; LinkServer.Start(); } // 服務(wù)端關(guān)閉 public static void LinkServerClose() { LinkServer?.ShutdownAsync().Wait(); } // 客戶端啟動 public static void LinkClientStart(string strIp) { Channel prechannel = new Channel(strIp, ChannelCredentials.Insecure); LinkClient = new LinkClient(prechannel); } // 客戶端發(fā)送消息函數(shù) 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、創(chuàng)建服務(wù)端和客戶端調(diào)用測試
(1)vs2022創(chuàng)建兩個Windows窗體應用(.NET Framework)項目。將上述GrpcLink.dll文件分別放入兩個項目中,并添加dll引用。安裝nuget包:Grpc.Core和Google.Protobuf。
(2)服務(wù)端TestServer項目。
窗體:
窗體代碼:
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項目。
窗體:
窗體代碼:
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)運行兩個項目進行測試。
在客戶端的發(fā)送區(qū)輸入要發(fā)送的內(nèi)容。
在服務(wù)端的回復區(qū)輸入要回復的內(nèi)容。
點擊發(fā)送:
到此這篇關(guān)于淺析C#封裝GRPC類庫及調(diào)用簡單實例的文章就介紹到這了,更多相關(guān)C#封裝GRPC類庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實現(xiàn)gRPC服務(wù)和調(diào)用示例詳解
gRPC?是一種與語言無關(guān)的高性能遠程過程調(diào)用?(RPC)?框架,這篇文章主要為大家詳細介紹了C#如何實現(xiàn)gRPC服務(wù)和調(diào)用,需要的可以參考一下2024-01-01在類庫或winform項目中打開另一個winform項目窗體的方法
這篇文章主要介紹了在類庫或winform項目中打開另一個winform項目窗體的方法,可以實現(xiàn)Winform項目間窗體的調(diào)用,在進行Winform項目開發(fā)中非常具有實用價值,需要的朋友可以參考下2014-11-11C#將隱私信息(銀行賬戶,身份證號碼)中間部分特殊字符替換成*
大家在銀行交易某些業(yè)務(wù)時,都可以看到無論是身份證、銀行賬號中間部分都是用*號替換的,下面這篇文章主要介紹C#將隱私信息(銀行賬戶,身份證號碼)中間部分特殊字符替換成*的相關(guān)資料,需要的朋友可以參考下2015-08-08