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); } } }
-
运行情况
分类:
C#
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现