最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中使用gRPC通訊的示例詳解

 更新時間:2024年04月11日 08:44:10   作者:叫我少年  
這篇文章主要為大家詳細介紹了C#中如何使用gRPC通訊,包括GRPC文件的創(chuàng)建生成、服務端和客戶端函數類庫的封裝等,需要的可以了解下

在c#中使用gRPC通訊

參考:C#封裝GRPC類庫及調用簡單實例

包括:GRPC文件的創(chuàng)建生成、服務端和客戶端函數類庫的封裝、創(chuàng)建服務端和客戶端調用測試。

創(chuàng)建并生成GRPC服務文件

  • 創(chuàng)建新項目控制臺應用 , 項目名稱(MgRPC)
  • 安裝三個nuget包 Google.Protobuf , Grpc.Core , Grpc.Tools
  • 項目添加新建項,選擇類,修改名稱為Link.proto,添加后把Link.proto里面內容清空

定義Protocol

添加代碼。測試實例為服務端和客戶端傳輸字符串消息,只定義了一個方法(客戶端調用,服務端重寫),傳輸內容包括請求字符串和回復字符串。此處可自行定義。

syntax = "proto3";//proto3 是 Protocol Buffers 的第三個版本

// 指定了生成的 C# 代碼的命名空間為 LinkService。當使用 protobuf 編譯器 (protoc) 將這個 .proto 文件轉換為 C# 代碼時,生成的類將位于 LinkService 命名空間中
option csharp_namespace = "LinkService";

//定義了一個名為 Link 的 gRPC 服務。在 gRPC 中,服務是由一個或多個 RPC 方法組成的
service Link
{
	//定義了一個 RPC 方法。這個方法名為 GetMessage,它接受一個 Mes 類型的消息作為參數,
	//并返回一個 Mes 類型的消息。在 gRPC 中,客戶端可以調用這個方法,并發(fā)送一個 Mes 消息給服務端,然后服務端會處理這個消息并返回一個 Mes 消息給客戶端。
	rpc GetMessage(Mes) returns (Mes);
}

//定義了一個名為 Mes 的消息類型。在 protobuf 中,消息是由一系列字段組成的,每個字段都有一個名稱、一個類型和一個標識符。
message Mes
{
    // 客戶端發(fā)送
	// 定義了一個名為 StrRequest 的字段,類型為 string,標識符為 1。這個標識符在消息內部是唯一的,并且一旦分配就不能更改,因為它被用于序列化和反序列化過程中的字段識別。
	string StrRequest = 1;
	// 同樣定義了一個名為 StrReply 的字段,類型為 string,標識符為 2。(服務端回復)
	string StrReply = 2;
}

設置Link.proto

右鍵Link.proto文件選擇屬性,生成操作選擇如圖:

生成cs文件代碼

生成解決方案。在下圖路徑得到自動生成的兩個類。

至此,獲得GRPC服務需要的三個文件:Link.proto、Link.cs、LinkGrpc.cs。可以將這三個文件放在一個項目中直接使用,需要重寫一下服務端方法、創(chuàng)建服務端和客戶端的啟動方法。但是如果不同的項目軟件之間通訊需要各自如此開發(fā)??梢韵确庋b成一個GRPC類庫供其他項目直接調用。

服務端和客戶端類庫的封裝

  • 創(chuàng)建類庫(.NET Framework)項目 , 項目名稱(GrpcLink)
  • 項目添加現(xiàn)有項,上面獲得的三個文件(Link.cs , LinkGrpc.cs)。安裝nuget包:Grpc.Core和Google.Protobuf。
  • 創(chuàng)建兩個類:LinkFunc用于放此類庫可用于外部引用調用的方法。LinkServerFunc基于Link.LinkBase,用于重寫在proto文件中定義的方法。

對于不同的項目,在客戶端請求時,服務端要根據自身情況回復想回的內容,因此可以提供一個委托供外部自行開發(fā)回復函數。

在LinkFunc類中定義如下:

public static Func<string, string> ReplyMes;

LinkServerFunc

在LinkServerFunc類重寫GetMessage方法如下

using Grpc.Core;
using LinkService;
using System.Threading.Tasks;
using static LinkService.Link;

namespace GrpcLink
{
    /// <summary>
    /// 重寫在proto文件中定義的方法
    /// </summary>
    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);
        }
    }
}

LinkFunc

using Grpc.Core;
using LinkService;
using System;
using static LinkService.Link;

namespace GrpcLink
{
    public class LinkFunc
    {
        /// <summary>
        /// 用于服務端回復委托
        /// </summary>
        public static Func<string,string> ReplyMes;

        // 定義服務端和客戶端
        public static Server LinkServer;
        public static LinkClient LinkClient;

        /// <summary>
        ///  服務端啟動
        /// </summary>
        /// <param name="host"></param>
        /// <param name="port"></param>
        public static void LinkServerStart(string host,int port)
        {
            LinkServer = new Server
            {
                Services =
                    {
                        BindService(new LinkServerFunc())
                    },
                Ports = { new ServerPort(host,port,ServerCredentials.Insecure) }
            };
            LinkServer.Start();
        }

        /// <summary>
        ///  服務端關閉
        /// </summary>
        public static void LinkServerClose()
        {
            LinkServer?.ShutdownAsync().Wait();
        }

        /// <summary>
        /// 客戶端啟動
        /// </summary>
        /// <param name="strIp"></param>
        public static void LinkClientStart(string strIp)
        {
            Channel prechannel = new Channel(strIp,ChannelCredentials.Insecure);
            LinkClient = new LinkClient(prechannel);
        }

        /// <summary>
        /// 客戶端發(fā)送消息函數
        /// </summary>
        /// <param name="strRequest"></param>
        /// <returns></returns>
        public static string SendMes(string strRequest)
        {
            Mes mes = new Mes();
            mes.StrRequest = strRequest;
            var res = LinkClient.GetMessage(mes);
            return res.StrReply;
        }
    }
}

生成引用庫

生成解決方案。Debug中可以得到項目的dll文件GrpcLink.dll,其他項目可以引用使用了。

創(chuàng)建服務端和客戶端調用測試

  • 創(chuàng)建兩個控制臺(.NET Framework)項目 , 項目名稱TestCilent , TestServer
  • 將上述GrpcLink.dll文件分別放入兩個項目中,并添加dll引用。 如果沒有則安裝nuget包:Grpc.Core和Google.Protobuf(此次測試沒有安裝)

TestServer服務端

using GrpcLink;
using System;
using System.Threading;

namespace TestServer
{
    /// <summary>
    /// 測試服務端
    /// </summary>
    internal class Program
    {
        static void Main(string[] args)
        {
            LinkFunc.LinkServerStart("127.0.0.1",9008);
            Thread.Sleep(500);
            LinkFunc.ReplyMes = ReplyMes;
            Console.ReadKey();
        }


        /// <summary>
        /// 接收到客戶端信息后回復
        /// </summary>
        /// <param name="strRequest">客戶端發(fā)送過來的內容</param>
        /// <returns></returns>
        public static string ReplyMes(string strRequest)
        {
            Console.WriteLine("接收到:" + strRequest);
            switch (strRequest)
            {
                case "1":
                return "Server識別到1";
                case "2":
                return "Server識別到2";
                case "測試":
                return "開始測試"; 
                case "連接服務端":
                return "true";
            }
            return "Server未識別到指定參數";
        }
    }
}

TestCilent客戶端

using GrpcLink;
using System;
using System.Threading;

namespace TestCilent
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Thread.Sleep(2000);
            LinkFunc.LinkClientStart("127.0.0.1:9008");
            Console.WriteLine("連接服務端中");
            string conn = LinkFunc.SendMes("連接服務端");

            if (conn.Equals("true"))
            {
                Console.WriteLine("連接服務端成功!");


                for (int i = 0 ; i < 10 ; i++)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("輸入測試內容..");
                    var line = Console.ReadLine();
                    var ret = LinkFunc.SendMes(line);
                    //獲取到服務端返回的值
                    Console.WriteLine(ret);

                }
            }

            Console.WriteLine("連接失敗 , 即將退出");
            Thread.Sleep(2000);
        }
    }
}

測試圖例

以上就是C#中使用gRPC通訊的示例詳解的詳細內容,更多關于C# gRPC通訊的資料請關注腳本之家其它相關文章!

相關文章

  • c# n個數排序實現(xiàn)代碼

    c# n個數排序實現(xiàn)代碼

    c# n個數排序實現(xiàn)代
    2009-07-07
  • C#使用LINQ查詢表達式的基本子句總結

    C#使用LINQ查詢表達式的基本子句總結

    這篇文章主要介紹了C#使用LINQ查詢表達式的基本子句總結,在C#程序中我們可以使用LINQ基本查詢表達式模式來查詢和轉換SQL數據庫、ADO.NET數據集、XML文檔和流以及.NET集合中的數據,需要的朋友可以參考下
    2016-03-03
  • 在C#中創(chuàng)建和讀取XML文件的實現(xiàn)方法

    在C#中創(chuàng)建和讀取XML文件的實現(xiàn)方法

    項目中需要將前臺頁面中的信息保存下來并存儲為xml文件格式到數據庫中去。因此我先在這里通過一個小實例來學習xml的創(chuàng)建與讀取
    2013-09-09
  • C#事件中關于sender的用法解讀

    C#事件中關于sender的用法解讀

    這篇文章主要介紹了C#事件中關于sender的用法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • C#中的XML與JSON數據處理的案例詳解

    C#中的XML與JSON數據處理的案例詳解

    在現(xiàn)代軟件開發(fā)中,數據交換和存儲的需求日益增長,而 XML 和 JSON 成為了兩種最常用的數據格式,它們各有特點,在不同的場景下有著各自的優(yōu)勢,本文將從 C# 的角度出發(fā),探討如何處理這兩種數據格式,并分享一些常見的問題及解決方法,需要的朋友可以參考下
    2024-09-09
  • C#中把FastReport.Net報表控件的數據保存到數據庫

    C#中把FastReport.Net報表控件的數據保存到數據庫

    這篇文章介紹了在數據庫中保存FastReport.Net報表的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#中反射和擴展方法如何運用

    C#中反射和擴展方法如何運用

    這篇文章主要為大家詳細介紹了C#中反射和擴展方法的運用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • C#讀取系統(tǒng)字體顏色與大小的方法

    C#讀取系統(tǒng)字體顏色與大小的方法

    這篇文章主要介紹了C#讀取系統(tǒng)字體顏色與大小的方法,較為詳細的分析了C#獲取系統(tǒng)字體顏色與大小的相關技巧,需要的朋友可以參考下
    2015-06-06
  • C#應用ToolStrip控件使用方法

    C#應用ToolStrip控件使用方法

    在本篇文章里小編給大家分享了關于C#應用ToolStrip控件使用方法和技巧,對此有興趣的朋友們學習下。
    2019-01-01
  • 通過C#調用cmd來修改服務啟動類型

    通過C#調用cmd來修改服務啟動類型

    可以使用System.ServiceProcess.ServiceController這個類允許連接到正在運行或者已停止的服務、對其進行操作或獲取有關它的信息但是這個類并沒有提供修改服務啟動類型的方法,可以通過C#調用cmd來修改
    2012-12-12

最新評論

滦南县| 桦南县| 余干县| 和林格尔县| 株洲县| 兴业县| 宜宾市| 靖州| 三都| 思茅市| 沙雅县| 天水市| 阳城县| 安多县| 普宁市| 西林县| 鞍山市| 夏邑县| 达拉特旗| 大安市| 开鲁县| 陇川县| 沅江市| 秦皇岛市| 和政县| 安庆市| 都兰县| 博白县| 岢岚县| 连州市| 高阳县| 胶南市| 香河县| 荥阳市| 图木舒克市| 康乐县| 育儿| 云霄县| 北流市| 临夏县| 镇赉县|