NETCORE - Grpc 通信四种方式

NETCORE - Grpc 通信四种方式

 项目搭建:https://www.cnblogs.com/1285026182YUAN/p/17679730.html

 

GRPC支持四种通信方式,分别是:

  1. UNARY:这是一种最简单的客户端与服务端模式,其中客户端发送一个消息后,阻塞等待服务端回复一个消息。
  2. CLIENT STREAMING:在这种模式下,客户端将发送多个消息流,而后服务端回复一个消息。
  3. SERVER STREAMING:客户端仅发送一个消息,而后服务端回复多个消息流。
  4. BIDIRECTIONAL STREAMING:客户端与服务端将多次发送和接收多条消息,任何一方都无需在发送一条消息之前等待响应。

 

一.  demo:Server Streaming

1. 定义GRPC服务

需要在你的 .proto 文件中定义你的 gRPC 服务和方法。对于服务端流式传输,你需要在方法定义中使用 stream 关键字来指定返回类型为流。

复制代码
syntax = "proto3";

option csharp_namespace = "RailAssist.Grpc";

package greet;
 
service Sustained {
  rpc StreamData (StreamDataRequest) returns (stream StreamDataResponse);
}

message StreamDataRequest {
  string some_data = 1;
}

message StreamDataResponse {
  string streamed_data = 1;
}
复制代码

 

 

 

 

2. 实现 gRPC 服务

在你的 C# 项目中,实现你在 .proto 文件中定义的 gRPC 服务。对于服务端流式传输,你需要实现一个异步方法,并使用 IAsyncStreamReader<T> 来发送消息。

 

复制代码
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using RailAssist.Grpc;

namespace RailAssist.Grpc.Services;

public class SustainedService : Sustained.SustainedBase
{
    public override async Task StreamData(StreamDataRequest request, IServerStreamWriter<StreamDataResponse> responseStream, ServerCallContext context)
    {
        for (int i = 0; i < 20; i++) // 假设发送10条消息
        {
            await responseStream.WriteAsync(new StreamDataResponse { StreamedData = $"Data {i}-{request.SomeData}" });
            await Task.Delay(3000); // 等待1秒再发送下一条消息
        }
    }
}
复制代码

 

 

  

3. 在Pragram.cs中注入

app.MapGrpcService<SustainedService>();

 

4. 测试

 

 5. 客户端调用:

复制代码
        [HttpGet]
        [Route("GetGrpcTestStream")]
        public async Task<IActionResult> GetGrpcTestStream(int fileId)
        {
            string url = configuration.GetSection("GrpcConfig:Assist").Value;
            var channel = GrpcChannel.ForAddress(url, channelOptionsDefault);
            var client = new Sustained.SustainedClient(channel);

            using var call = client.StreamData(new StreamDataRequest { SomeData = fileId.ToString() });

            var arr = new List<string>();

            while (await call.ResponseStream.MoveNext())
            {
                var response = call.ResponseStream.Current;
                Console.WriteLine(response.StreamedData); // 打印接收到的每条消息
                arr.Add(response.StreamedData);
            }
            await Console.Out.WriteLineAsync(string.Join(",", arr));
            return Ok();
        }
复制代码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

 

posted @   无心々菜  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2020-06-12 NETCORE - Redis的使用3
点击右上角即可分享
微信分享提示