Unity中的gRPC通信

概述

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。

gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。

gRPC已经应用在Google的云服务和对外提供的API中,其主要应用场景如下:

低延迟、高扩展性、分布式的系统

同云服务器进行通信的移动应用客户端

设计语言独立、高效、精确的新协议

便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等

参考文档:

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


C#中的使用

如何在C#中使用,需要在工程中Grpc.Core.dll,需将其主要是利用grpc_csharp_plugin.exe将proto转化成C#文件,在工程中引用其生成的两个C#访问类文件即可。

定义proto的协议

设计proto协议文件,该文件的格式为.proto,命名为AccountService.proto。

syntax = "proto3";//gRPC必须使用protocol buffer3.0版本,所以syntax设置为proto3。

package gRPCDemo;//包名,即为C#的命名空间的名字 namespace

service AccountService{//所生成的访问类名

rpc SayHello (HelloRequest) returns (HelloReply) {}//定义其方式,请求和回调的结构体

}

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

创建一个bat文件,编写一下命名行:

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

执行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协议,我们就要在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文件则创建bat文件

        fs.SetLength(0);//清空

        fs.Close();//关闭流对象

        var sw = new StreamWriter(filePath);//创建写入流

        sw.WriteLine("set PJ_PATH=" + Application.dataPath);//写入结束时换行

        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文件,调用外部进程开启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)//设置进程

        {

            CreateNoWindow = false,

            UseShellExecute = true,

            RedirectStandardError = false,

            RedirectStandardInput = false,

        };

        System.Diagnostics.Process.Start(pStartInfo);//开始进程

    }

至此,一个在编辑器上直接生成bat文件和生成所需的访问类文件。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容