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 IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南