1:首先使用vs创建proto文件,例如:我创建的my.proto文件如下:
syntax = "proto3";
package MyGrpc;
//服务名称
service MsgService {
//函数名称 (入参)retrurns(出参)
rpc Send (MsgRequest) returns (MsgResponse);
}
message MsgRequest{
string req=1;//定义入参实体
}
message MsgResponse{
string res=1;//定义出参实体
}
2:nuget下载Grpc.Core、Google.Protobuf
3:找到项目中packages文件夹目录,在该目录上输入cmd,
然后输入命令:
packages\Grpc.Tools.2.39.1\tools\windows_x64\protoc.exe (程序路径)
-I Protos(-I 指定一个或者多个目录,用来搜索.proto文件的,如果不指定,那就是当前目录,因为-I已经指定了Protos,所以是找Protos目录下的.proto文件。)
--csharp_out Protos (生成C#代码的路径,代码生成在Protos目录下)
Protos\my.proto(proto文件地址)
--grpc_out Protos(输出路径)
--plugin=protoc-gen-grpc=packages\Grpc.Tools.2.39.1\tools\windows_x64\grpc_csharp_plugin.exe
完整的语句:
packages\Grpc.Tools.2.39.1\tools\windows_x64\protoc.exe -I Protos --csharp_out Protos Protos\my.proto --grpc_out Protos --plugin=protoc-gen-grpc=packages\Grpc.Tools.2.39.1\tools\windows_x64\grpc_csharp_plugin.exe
执行完毕后会在指定的文件夹中生成两个文件
服务端:
Server server = new Server
{
Services = { MyGrpc.MsgService.BindService(new FirstGrpc()) },
Ports = { new ServerPort("127.0.0.1", 18201, ServerCredentials.Insecure) }
};
server.Start();
Console.Read();
server.ShutdownAsync().Wait();
public class FirstGrpc : MsgService.MsgServiceBase
{
public override Task<MsgResponse> Send(MsgRequest request, ServerCallContext context)
{ return Task.FromResult(new MsgResponse { Res = $"1" });
}
}
客户端:
Channel channel = new Channel("127.0.0.1:18201", ChannelCredentials.Insecure);
var client = new MsgService.MsgServiceClient(channel);
var replay = client.Send(new MsgRequest { Req = “内容” });
channel.ShutdownAsync().Wait();