大果子你说谁呢 2023-10-19 17:08 采纳率: 33.3%
浏览 9
已结题

c#通过grpc和protobuf实现读取文件解析成list集合,并返回给客户端

c#通过grpc和protobuf实现读取文件解析成list集合,并返回给客户端

Protobuf文件:
service Protobuf {
  rpc GetFiles(msgRequest) returns(msgData){}
  }

Grpc
[System.Obsolete]
        public override Task<msgDatas> GetFile(msgRequest request, ServerCallContext context)
        {
            try
            {
                return Task.FromResult(Service.GetCommObservable(request.Note).FirstOrDefault());
            }
            catch (TaskCanceledException TCex)
            {
              
            }
        }
  
  public msgDatas GetFile(string pCondition)
        {
            var call = gRPCclient.GetFiles(new msgRequest() { Note = pCondition });
            return call;
        }
  
  public List<msgData> GetFileData(string pCondition)
        {
            List<msgData> rtnValue = new List<msgData>();
            
                string LocalDestinationFolder = System.Threading.Thread.GetDomain().BaseDirectory.TrimEnd('\\');//download to local path
                string[] datStr = File.ReadAllLines(LocalDestinationFolder + "\\" + "20231011153021.dat");//largeBytes
                var lists = new List<List<string>>();//lists
                 string tmpStr = string.Empty;//marker
                var tmpLst = new List<string>();//tmpLst
                foreach (var datstr in datStr)
                {
                    if (datstr == tmpStr)
                    {
                        lists.Add(tmpLst);
                        tmpLst = new List<string>();
                    }
                    else
                    {
                        tmpLst.Add(datstr);
                    }
                }
                lists.Add(tmpLst);
                foreach (var list in lists)
                {
                    xxx = list[0].ToString(); 
                    xxx = list[1];
                    xxx = list[2];
                    xxx = list[3];
                    stringBuilder.Clear();
                    for (int n = 5; n < list.Count; n++)
                    {
                        stringBuilder.Append(list[n]).Append("\n");
                    }

                    text = stringBuilder.ToString();
                    rtnValue.Add(new msgData()
                    {
                        xxx = xxx,
                        xxx = xxx,
                        xxx = xxx,
                        xxx = xxx,
                        xxx = xxx
                    });
                }
            }
            catch (Exception ex)
            {
                _logger.Info(ex);
            }
            return rtnValue;
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-20 04:31
    关注

    【以下回答由 GPT 生成】

    首先,需要确保已安装gRPC和Protobuf的C#库。可以使用以下命令来安装它们:

    dotnet add package Grpc.Net.Client
    dotnet add package Google.Protobuf
    dotnet add package Grpc.Tools
    

    接下来,需要创建一个.proto文件,定义gRPC服务和消息类型。在你的例子中,已经创建了一个.proto文件,但是需要做一些更改以正确定义服务。以下是更新后的.proto文件示例:

    syntax = "proto3";
    
    option csharp_namespace = "YourNamespaceName";
    
    package myservice;
    
    service Protobuf {
      rpc GetFiles(msgRequest) returns (msgData){}
    }
    
    message msgRequest {
      // 添加所需的请求字段
      string note = 1;
    }
    
    message msgData {
      // 添加所需的响应字段
      string data = 1;
    }
    

    接下来,使用以下命令将.proto文件编译为C#类:

    protoc -I . --csharp_out . --grpc_out . --plugin=protoc-gen-grpc=path/to/grpc_csharp_plugin yourproto.proto
    

    完成后,将生成两个文件:yourproto.cs和yourproto.grpc.cs。将这两个文件添加到你的项目中。

    修改你的Grpc服务类以正确实现gRPC服务:

    public class ProtobufService : Protobuf.ProtobufBase
    {
        public override async Task<msgData> GetFiles(msgRequest request, ServerCallContext context)
        {
            List<msgData> dataList = GetFileData(request.Note);
            foreach (var data in dataList)
            {
                await Task.Delay(100); // 模拟处理每个数据的时间
                await responseStream.WriteAsync(data);
            }
            return new msgData(); // 返回空的msgData对象作为结束标志
        }
    }
    

    接下来,创建客户端代码来调用gRPC服务:

    static async Task Main(string[] args)
    {
        var channel = GrpcChannel.ForAddress("https://localhost:5001");
        var client = new Protobuf.ProtobufClient(channel);
    
        using (var call = client.GetFiles(new msgRequest {Note = "your_condition"}))
        {
            while (await call.ResponseStream.MoveNext())
            {
                var data = call.ResponseStream.Current.Data;
                // 处理返回的数据
                Console.WriteLine(data);
            }
        }
    }
    

    最后,修改你的GetFileData方法以将文件内容解析为List:

    public List<msgData> GetFileData(string pCondition)
    {
        List<msgData> rtnValue = new List<msgData>();
    
        string LocalDestinationFolder = System.Threading.Thread.GetDomain().BaseDirectory.TrimEnd('\\');
        string filePath = Path.Combine(LocalDestinationFolder, "20231011153021.dat");
    
        string[] datStr = File.ReadAllLines(filePath);
    
        msgData currentData = null;
        foreach (var dat in datStr)
        {
            if (string.IsNullOrEmpty(dat))
            {
                if (currentData != null)
                {
                    rtnValue.Add(currentData);
                    currentData = null;
                }
            }
            else
            {
                if (currentData == null)
                {
                    currentData = new msgData();
                }
                currentData.Data += dat;
            }
        }
        if (currentData != null)
        {
            rtnValue.Add(currentData);
        }
    
        return rtnValue;
    }
    

    这样,你就可以通过gRPC和Protobuf读取文件并将其解析为List集合,并将结果返回给客户端了。请确保使用正确的命名空间和文件路径以适应你的项目。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月24日
  • 修改了问题 10月19日
  • 创建了问题 10月19日

悬赏问题

  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战