-
创建Wpf库项目Hello、Wpf项目HelloServer、Wpf项目HelloClient
-
库项目Hello中引入Nuget
Grpc、Grpc.Tools
- Wpf项目Client、Server分别引入Nuget
Grpc
- 编写proto
syntax = "proto3";
option csharp_namespace = "greeter.hello";
service Greeter{
rpc SayHello (HelloRequest) returns (HelloResponse);
rpc SayWorld (HelloRequest) returns (HelloResponse);
}
message HelloRequest{
string name = 1;
}
message HelloResponse{
string message = 1;
}
- 使用命令行方式编译proto、rpc
..packagesGrpc.Tools.2.27.0 oolswindows_x64protoc.exe -I.Proto --csharp_out ./ --grpc_out ./ --plugin=protoc-gen-grpc=..packagesGrpc.Tools.2.27.0 oolswindows_x64grpc_csharp_plugin.exe .Proto
outine.proto
-
使用Grpc.Tools在vs配置编译选项编译groto、rpc
proto文件的属性, Build Action、gRpc Stub Classes(server and client/server only/client only)、Class Access, 此属性面板的功能由Nuget包Grpc.Tools提供 -
Server实现gRpcService
using System.Threading.Tasks;
using greeter.hello;
using Grpc.Core;
namespace HelloServer.gRpcService
{
class GreeterService: Greeter.GreeterBase
{
public override Task<HelloResponse> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloResponse() {Message = "server responsed: " + "hello " + request.Name});
}
public override Task<HelloResponse> SayWorld(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloResponse() {Message = "server responsed: " + request.Name + " world"});
}
}
}
- 创建服务端
using System.ComponentModel;
using System.Windows;
using greeter.hello;
using Grpc.Core;
using HelloServer.gRpcService;
namespace HelloServer
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private Server server;
public MainWindow()
{
InitializeComponent();
this.Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
server = new Server()
{
Services = { Greeter.BindService(new GreeterService())},
Ports = { new ServerPort("localhost", 8099, ServerCredentials.Insecure)}
};
server.Start();
}
protected override void OnClosing(CancelEventArgs e)
{
server?.ShutdownAsync().Wait();
base.OnClosing(e);
}
}
}
- 创建客户端
using System.ComponentModel;
using System.Windows;
using greeter.hello;
using Grpc.Core;
namespace HelloClient
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private Channel channel;
private Greeter.GreeterClient client;
public MainWindow()
{
InitializeComponent();
this.Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
channel = new Channel("localhost", 8099, ChannelCredentials.Insecure);
client = new Greeter.GreeterClient(channel);
var response = client.SayHello(new HelloRequest() { Name = "Link Sun" });
lvResponse.Items.Add(response);
}
private void TbHello_OnClick(object sender, RoutedEventArgs e)
{
string name = tbName.Text;
var response = client.SayHello(new HelloRequest() { Name = name });
lvResponse.Items.Add(response);
}
private void TbWorld_OnClick(object sender, RoutedEventArgs e)
{
string name = tbName.Text;
var response = client.SayWorld(new HelloRequest() { Name = name });
lvResponse.Items.Add(response);
}
protected override void OnClosing(CancelEventArgs e)
{
channel?.ShutdownAsync().Wait();
base.OnClosing(e);
}
}
}
-
运行情况