zoukankan      html  css  js  c++  java
  • 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
    ..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);
            }
        }
    }
    
  • 相关阅读:
    CodeForces Round #516 Div2 题解
    BZOJ3300: [USACO2011 Feb]Best Parenthesis 模拟
    BZOJ4994: [Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组
    BZOJ3297: [USACO2011 Open]forgot DP+字符串
    BZOJ3296: [USACO2011 Open] Learning Languages 并查集
    BZOJ2442: [Usaco2011 Open]修剪草坪 单调队列优化dp
    BZOJ3298: [USACO 2011Open]cow checkers 威佐夫博弈
    什么是 DDoS 攻击?
    快速了解“云原生”(Cloud Native)和前端开发的技术结合点
    一文读懂spring boot 和微服务的关系
  • 原文地址:https://www.cnblogs.com/linxmouse/p/12396197.html
Copyright © 2011-2022 走看看