Wpf的gRpc的Server/Client

  • 创建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
..\packages\Grpc.Tools.2.27.0\tools\windows_x64\protoc.exe -I.\Proto\ --csharp_out ./ --grpc_out ./ --plugin=protoc-gen-grpc=..\packages\Grpc.Tools.2.27.0\tools\windows_x64\grpc_csharp_plugin.exe .\Proto\routine.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);
}
}
}
posted @   非法关键字  阅读(2316)  评论(1编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
点击右上角即可分享
微信分享提示