Unity中的gRPC通信

概述

gRPC是一個高性能晃跺、通用的開源RPC框架衙傀,其由Google主要面向移動應(yīng)用開發(fā)并基于HTTP/2協(xié)議標(biāo)準(zhǔn)而設(shè)計励翼,基于ProtoBuf(Protocol Buffers)序列化協(xié)議開發(fā)徒坡,且支持眾多開發(fā)語言羞酗。gRPC提供了一種簡單的方法來精確地定義服務(wù)和為iOS、Android和后臺支持服務(wù)自動生成可靠性很強的客戶端功能庫无蜂∷趴罚客戶端充分利用高級流和鏈接功能,從而有助于節(jié)省帶寬斥季、降低的TCP鏈接次數(shù)训桶、節(jié)省CPU使用、和電池壽命酣倾。

gRPC支持多種語言舵揭,并能夠基于語言自動生成客戶端和服務(wù)端功能庫。目前躁锡,在GitHub上已提供了C版本grpc午绳、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發(fā)中映之,其中 grpc支持C箱叁、C++、Node.js惕医、Python耕漱、Ruby、Objective-C抬伺、PHP和C#等語言螟够,grpc-java已經(jīng)支持Android開發(fā)。

gRPC已經(jīng)應(yīng)用在Google的云服務(wù)和對外提供的API中峡钓,其主要應(yīng)用場景如下:

低延遲妓笙、高擴展性、分布式的系統(tǒng)

同云服務(wù)器進(jìn)行通信的移動應(yīng)用客戶端

設(shè)計語言獨立能岩、高效寞宫、精確的新協(xié)議

便于各方面擴展的分層設(shè)計,如認(rèn)證拉鹃、負(fù)載均衡辈赋、日志記錄、監(jiān)控等

參考文檔:

http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf


C#中的使用

如何在C#中使用膏燕,需要在工程中Grpc.Core.dll钥屈,需將其主要是利用grpc_csharp_plugin.exe將proto轉(zhuǎn)化成C#文件,在工程中引用其生成的兩個C#訪問類文件即可坝辫。

定義proto的協(xié)議

設(shè)計proto協(xié)議文件篷就,該文件的格式為.proto,命名為AccountService.proto近忙。

syntax = "proto3";//gRPC必須使用protocol buffer3.0版本竭业,所以syntax設(shè)置為proto3智润。

package gRPCDemo;//包名,即為C#的命名空間的名字 namespace

service AccountService{//所生成的訪問類名

rpc SayHello (HelloRequest) returns (HelloReply) {}//定義其方式未辆,請求和回調(diào)的結(jié)構(gòu)體

}

message HelloRequest {

string name = 1;

}

message HelloReply {

string message = 1;

}

生成proto訪問類

?使用Google.Protobuf提供的protoc.exe工具將 proto文件生成訪問類protoc做鹰,使用gRPC定義的protoc的C#插件grpc_csharp_plugin.exe,所以需要有proto文件鼎姐、protoc.exe钾麸、grpc_csharp_plugin.exe才能生成所需要的C#訪問類。

將以下幾個文件放在同一文件夾中:

AccountService.proto

protoc.exe

grpc_csharp_plugin.exe

創(chuàng)建一個bat文件炕桨,編寫一下命名行:

protoc.exe -I=.--csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe AccountService .proto

執(zhí)行bat文件饭尝,將會 生成以下文件:

//以proto的命名生成訪問類的文件名

AccountService?.cs

AccountService?Grpc.cs

在項目中的使用

將輸入輸出放在指定的文件夾,則將所需的exe放在編輯器Editor文件下献宫,Edito文件夾不被打包

protoc.exe

grpc_csharp_plugin.exe

將proto文件放入Editor文件夾下钥平,新建一個bat文件

set PJ_PATH=E:/PJ/IOGame1/Assets//路徑引用

%PJ_PATH%/10_Plugins\Editor\grpc\protoc.exe// protoc路徑

%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile\client.proto//proto文件

%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile\common.proto

--proto_path=%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile//proto文件存放的路徑

--csharp_out=%PJ_PATH%\0_Scripts\Net\GrpcGenerated//Cs文件的輸出路徑

--grpc_out=%PJ_PATH%/0_Scripts\Net\GrpcGenerated//GrpcC#文件的輸出路徑

--plugin=protoc-gen-grpc=%PJ_PATH%\10_Plugins\Editor\grpc\grpc_csharp_plugin.exe// Grpc的工具路徑

pause

拓展:

如果我們新建一個proto協(xié)議,我們就要在bat文件再新建一個命令行姊途,若多個涉瘾,則要添加多個。作為程序員捷兰,我們是要懶得去一行行添加的立叛。

思路:遍歷proto文件夾下的所有的proto文件,寫入到bat文件:

private static void GenerateBatFile()

? ? {

? ? ? ? var filePath = Application.dataPath + "/10_Plugins/Editor/grpc/generate_protos.bat";//bat路徑

? ? ? ? var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);//文件流贡茅,不存在bat文件則創(chuàng)建bat文件

? ? ? ? fs.SetLength(0);//清空

? ? ? ? fs.Close();//關(guān)閉流對象

? ? ? ? var sw = new StreamWriter(filePath);//創(chuàng)建寫入流

? ? ? ? sw.WriteLine("set PJ_PATH=" + Application.dataPath);//寫入結(jié)束時換行

? ? ? ? var path = Application.dataPath + "/10_Plugins/Editor/grpc/ProtoFile";//存放proto文件的文件夾路徑

? ? ? ? var root = new DirectoryInfo(path);//獲取文件字典集

? ? ? ? string filePaths = " ";

? ? ? ? foreach (var f in root.GetFiles())

? ? ? ? {

? ? ? ? ? ? if (!f.Name.Contains(".meta"))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? filePaths += @"%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile\" + f.Name + " ";//遍歷proto文件秘蛇,其路徑以空格鍵隔開

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? sw.WriteLine(@"%PJ_PATH%/10_Plugins\Editor\grpc\protoc.exe{0}--proto_path=%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile --csharp_out=%PJ_PATH%\0_Scripts\Net\GrpcGenerated --grpc_out %PJ_PATH%/0_Scripts\Net\GrpcGenerated --plugin=protoc-gen-grpc=%PJ_PATH%\10_Plugins\Editor\grpc\grpc_csharp_plugin.exe", filePaths);

? ? ? ? sw.WriteLine("pause");

? ? ? ? sw.Close();

? ? }

在Unity拓展工具時使用bat文件,調(diào)用外部進(jìn)程開啟bat命令:

[MenuItem("Grpc/GenerateGrpcFile")]

? ? private static void GenerateGrpcFile()

? ? {

? ? ? ? var batName = Application.dataPath + "/10_Plugins/Editor/grpc/generate_protos.bat";//bat路徑

? ? ? ? var pStartInfo = new System.Diagnostics.ProcessStartInfo(batName)//設(shè)置進(jìn)程

? ? ? ? {

? ? ? ? ? ? CreateNoWindow = false,

? ? ? ? ? ? UseShellExecute = true,

? ? ? ? ? ? RedirectStandardError = false,

? ? ? ? ? ? RedirectStandardInput = false,

? ? ? ? };

? ? ? ? System.Diagnostics.Process.Start(pStartInfo);//開始進(jìn)程

? ? }

至此顶考,一個在編輯器上直接生成bat文件和生成所需的訪問類文件赁还。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驹沿,隨后出現(xiàn)的幾起案子艘策,更是在濱河造成了極大的恐慌,老刑警劉巖渊季,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋蔫,死亡現(xiàn)場離奇詭異,居然都是意外死亡梭域,警方通過查閱死者的電腦和手機斑举,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來病涨,“玉大人,你說我怎么就攤上這事璧坟〖饶拢” “怎么了赎懦?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幻工。 經(jīng)常有香客問我励两,道長,這世上最難降的妖魔是什么囊颅? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任当悔,我火速辦了婚禮,結(jié)果婚禮上踢代,老公的妹妹穿的比我還像新娘盲憎。我一直安慰自己,他們只是感情好胳挎,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布饼疙。 她就那樣靜靜地躺著,像睡著了一般慕爬。 火紅的嫁衣襯著肌膚如雪窑眯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天医窿,我揣著相機與錄音磅甩,去河邊找鬼。 笑死姥卢,一個胖子當(dāng)著我的面吹牛更胖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隔显,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼却妨,長吁一口氣:“原來是場噩夢啊……” “哼栋荸!你這毒婦竟也來了佣赖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤呼巷,失蹤者是張志新(化名)和其女友劉穎掷豺,沒想到半個月后捞烟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡当船,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年题画,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片德频。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡苍息,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竞思,我是刑警寧澤表谊,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站盖喷,受9級特大地震影響爆办,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜课梳,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一距辆、第九天 我趴在偏房一處隱蔽的房頂上張望暮刃。 院中可真熱鬧跨算,春花似錦、人聲如沸沾歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灾搏。三九已至挫望,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狂窑,已是汗流浹背媳板。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泉哈,地道東北人蛉幸。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像丛晦,于是被迫代替她去往敵國和親奕纫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容