zoukankan      html  css  js  c++  java
  • .Net Core框架下 Grpc四种处理方法

    1、在.Net Core框架下 实现Grpc客户端和服务端的四种处理方法,包括:

    一元方法
    服务器流式处理方法
    客户端流式处理方法
    双向流式处理方法

    2、沿用上一篇的服务端,修改GreeterService.cs文件

     public class GreeterService : TestGrpc.TestGrpcBase
        {
            private readonly ILogger<GreeterService> _logger;
            public GreeterService(ILogger<GreeterService> logger)
            {
                _logger = logger;
            }
    
            public override Task<TestReply> TestSay(TestRequest request, ServerCallContext context)
            {
                Console.WriteLine($"接收到{request.Name}的消息");
                return Task.FromResult(new TestReply
                {
                    Message = "Hello " + request.Name
                });
            }
    
            public override async Task StreamingFromServer(ExampleRequest request, IServerStreamWriter<ExampleResponse> responseStream, ServerCallContext context)
            {
                Console.WriteLine("服务器流开始响应。。。。");
                for (int i = 0; i < 5; i++)
                {
                    await responseStream.WriteAsync(new ExampleResponse()
                    {
                        Name="qq",
                        Sex="woman"
                    });
                    await Task.Delay(TimeSpan.FromSeconds(1));
                }
                Console.WriteLine("服务器流结束响应。。。。");
            }
    
            public override Task<ExampleResponse> StreamingFromClient(IAsyncStreamReader<ExampleRequest> requestStream, ServerCallContext context)
            {
                Console.WriteLine("服务器开始响应客户端流。。。。");
                return Task.FromResult(new ExampleResponse
                {
                    Name = "客户端流"
                });
            }
    
            public override async Task StreamingBothWays(IAsyncStreamReader<ExampleRequest> requestStream, IServerStreamWriter<ExampleResponse> responseStream, ServerCallContext context)
            {
                Console.WriteLine("双向流开始响应。。。。");
                await foreach (var message in requestStream.ReadAllAsync())
                {
                    await responseStream.WriteAsync(new ExampleResponse()
                    {
                        Name="双向流"
                    });
                }
                Console.WriteLine("双向流结束响应。。。。");
            }
        }

    3、修改greet.proto文件

    syntax = "proto3";
    
    option csharp_namespace = "MyGrpcServer";
    
    package MyGrpc;
    
    // The greeting service definition.
    service TestGrpc {
      // Sends a greeting
      rpc TestSay (TestRequest) returns (TestReply);
    
      rpc StreamingFromServer(ExampleRequest) returns (stream ExampleResponse);
    
      rpc StreamingFromClient(stream ExampleRequest) returns (ExampleResponse);
    
      rpc StreamingBothWays(stream ExampleRequest) returns (stream ExampleResponse);
    
    }
    
    // The request message containing the user's name.
    message TestRequest {
      string name = 1;
    }
    
    // The response message containing the greetings.
    message TestReply {
      string message = 1;
    }
    
    message ExampleRequest{
    int32 pageIndex=1;
    int32 pageSize=2;
    bool isDescending=3;
    }
    
    message ExampleResponse{
    string name=1;
    string sex=2;
    }

    4、沿用上一篇的客户端,修改Program.cs

     class Program
        {
            static async Task Main(string[] args)
            {
                using var channel = GrpcChannel.ForAddress("http://localhost:5000");
                var client = new TestGrpc.TestGrpcClient(channel);
                #region 一元方法
                var ret = await client.TestSayAsync(new TestRequest { Name = "MyTestClient" });
                Console.WriteLine("MyTestGrpc: " + ret.Message);
                #endregion
    
                #region 服务器流
                using var call = client.StreamingFromServer(new ExampleRequest { PageIndex = 1,PageSize=3,IsDescending=true });
    
                while (await call.ResponseStream.MoveNext())
                {
                    Console.WriteLine("服务器流: " + call.ResponseStream.Current.Name);
                    // "Greeting: Hello World" is written multiple times
                }
                #endregion
    
                #region 客户端流
    
                using var clientStream = client.StreamingFromClient();
    
                for (var i = 0; i < 5; i++)
                {
                    Console.WriteLine("客户端流"+i);
                 
                    await clientStream.RequestStream.WriteAsync(new ExampleRequest { PageIndex = 1, PageSize = 3, IsDescending = true });
    
                }
                await clientStream.RequestStream.CompleteAsync();
    
                var response = await clientStream;
                Console.WriteLine($"客户端流: {response.Name}");
    
                #endregion
    
                #region 双向流
    
                using var bothStream = client.StreamingBothWays();
    
                for (var i = 0; i < 100; i++)
                {
                    Console.WriteLine("双向流" + i);
    
                    await bothStream.RequestStream.WriteAsync(new ExampleRequest { PageIndex = 1, PageSize = 3, IsDescending = true });
    
                }
                await bothStream.RequestStream.CompleteAsync();
                while (await bothStream.ResponseStream.MoveNext())
                {
                    Console.WriteLine("双向流: " + bothStream.ResponseStream.Current.Name);
                    // "Greeting: Hello World" is written multiple times
                }
    
                
    
                #endregion
    
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }

    5、修改greet.proto文件

    syntax = "proto3";
    
    option csharp_namespace = "MyGrpcClient";
    
    package MyGrpc;
    
    // The greeting service definition.
    service TestGrpc {
      // Sends a greeting
      rpc TestSay (TestRequest) returns (TestReply);
    
      rpc StreamingFromServer(ExampleRequest) returns (stream ExampleResponse);
    
      rpc StreamingFromClient(stream ExampleRequest) returns (ExampleResponse);
    
      rpc StreamingBothWays(stream ExampleRequest) returns (stream ExampleResponse);
    }
    
    // The request message containing the user's name.
    message TestRequest {
      string name = 1;
    }
    
    // The response message containing the greetings.
    message TestReply {
      string message = 1;
    }
    
    message ExampleRequest{
    int32 pageIndex=1;
    int32 pageSize=2;
    bool isDescending=3;
    }
    
    message ExampleResponse{
    string name=1;
    string sex=2;
    }
  • 相关阅读:
    EditPlus等编辑器选中列(块)的方法
    构建Springboot项目的3种方式
    STS各版本下载
    Spring Boot 各版本的Java版本要求
    Maven安装
    Linux find命令:在目录中查找文件(超详解)
    rpm命令怎么指定安装位置
    CentOS6.8安装RabbitMQ
    codeforces459D:Pashmak and Parmida's problem
    codeforces 705B:Spider Man
  • 原文地址:https://www.cnblogs.com/lhwpc/p/15160792.html
Copyright © 2011-2022 走看看