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;
    }
  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/lhwpc/p/15160792.html
Copyright © 2011-2022 走看看