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 @   非法关键字  阅读(2323)  评论(1编辑  收藏  举报
编辑推荐:
· 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代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示