一.环境
1.Vs2022,使用net frameWork框架,C# 7.3版本
二:Grpc服务编写
1.创建类库
2.直接引用Grpc用到的Dll,下图框出的
若无dll,可以安装Grpc,Grpc.Protobuf,Grpc.Tool工具包或者上网下一个
3.新建文件夹protos,在里面新建一个greet.proto文件
4.通过之前下好的Grpc.tool包中的下面工具,可以在cmd命令行中编译proto文件
指令如下:
protoc.exe --csharp_out ./ *.proto --grpc_out ./ --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe
--csharp_out:用来生成C#代码,还可以支持cpp_out,java_out,javanano_out,python_out.......
随后参数1:是指输出路径
--grpc_out:输出生成的实体类
csharp_out:生成的文件叫做xxx.cs
grpc_out:生成的文件叫做xxxGrpc.cs
随后参数1:是指输出路径
--plugin==protoc-gen-grpc=grpc_csharp_plugin.exe:这个就是C#的插件,每个语言都要各自的插件,都必须指定
packages\grpc.tools\1.17.1\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out GRPCDemo gRPCDemo\helloworld.proto --grpc_out gRPCDemo
--plugin=protoc-gen-grpc=packages\grpc.tools\1.17.1\tools\windows_x86\grpc_csharp_plugin.exe
5.得到新增的两个cs文件,加载到项目中
6.添加一个类GreeterService,编写服务代码
using System.Collections.Generic;
using System.Threading.Tasks;
using Grpc.Core;
using MyGrpcService;
public class GreeterService : Greeter.GreeterBase
{
public override async Task sayHelloStream(HelloRequest request, IServerStreamWriter<HelloReply> responseStream, ServerCallContext context)
{
for (int i = 0; i < 10; i++)
{
var reply = new HelloReply { Message = $"Hello {request.Name}, message {i}" };
await responseStream.WriteAsync(reply);
await Task.Delay(1000); // Simulate some work
}
}
}
7.编译后成功生成dll,下面的服务与客户端要引用
三:Grpc Server编写
1.新建一个NET Framework的项目Grpc_ServerDevice,选择 .NET Framework 4.7.2 或更高版本。
2.在项目中引用如下dll,注意:第四个dll是上面类库Grpc编译生成的
或者直接在NuGet 包管理器控制台,安装Grpc,Grpc.tool
3.在process中编写如下代码
using System;
using System.Threading.Tasks;
using Grpc.Core;
using MyGrpcService;
class Program
{
/// <summary>
/// 端口写入
/// </summary>
const int port = 50051;
static async Task Main(string[] args)
{
var server = new Server
{
Services = { Greeter.BindService(new GreeterService()) },
Ports = { new ServerPort("localhost", port, ServerCredentials.Insecure) },
};
server.Start();
Console.WriteLine($"Server listening on port {port}");
Console.WriteLine("Press any key to stop the server...");
Console.ReadKey();
await server.ShutdownAsync();
}
}
四:Grpc Client编写
1.新建一个NET Framework的项目Grpc_ClientDevice,选择 .NET Framework 4.7.2 或更高版本。
2.在项目中引用如下dll,注意:第四个dll是上面类库Grpc编译生成的
或者直接在NuGet 包管理器控制台,安装Grpc,Grpc.tool
3.在process中编写如下代码
using System;
using System.Threading.Tasks;
using Grpc.Core;
using MyGrpcService;
class Program
{
const string Target = "localhost:50051";
static async Task Main(string[] args)
{
var channel = new Channel(Target, ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
var request = new HelloRequest { Name = "World" };
var call = client.sayHelloStream(request);
try
{
while(await call.ResponseStream.MoveNext())
{
HelloReply reply = call.ResponseStream.Current;
Console.WriteLine(reply.Message);
}
}
catch (Exception ex)
{
Console.WriteLine($"RPC failed: {ex.Message}");
}
finally
{
await channel.ShutdownAsync();
}
}
}
5.效果运行