使用c#接收warlock的数据
1 目标
本文的目的是使用c#接收warlock的数据。
2 代码
2.1 添加必要的 NuGet 包
dotnet add package Grpc.Net.Client
dotnet add package Google.Protobuf
dotnet add package Grpc.Tools
2.2 添加 .proto 文件
将您的 afsim_service.proto 文件添加到项目中,并在 .csproj 文件中进行如下配置,以生成所需的 C# 类
<ItemGroup>
<Protobuf Include="afsim_service.proto" GrpcServices="Client" />
</ItemGroup>
2.3 在 .proto 文件中添加命名空间
syntax = "proto3";
option csharp_namespace = "Isim.Grpc"; // ← 自定义的 C# 命名空间
2.4 主程序
using System;
using System.Threading;
using System.Threading.Tasks;
using Grpc.Net.Client;
using Isim.Grpc;
//using af_service;
using Google.Protobuf;
using System.Collections.Generic;
using System.Reflection;
using Grpc.Core;
namespace GrpcClientApp
{
class Program
{
private const string ServerAddress = "http://127.0.0.1:5005";
private const int MaxRetries = 3;
private const int RetryDelaySeconds = 2;
static async Task Main(string[] args)
{
int retries = 0;
while (retries < MaxRetries)
{
try
{
Console.WriteLine($"尝试连接 {
ServerAddress}...");
using var channel = GrpcChannel.ForAddress(ServerAddress);
var client = new AFDataCollectService.AFDataCollectServiceClient(channel);
var entityTask = Task.Run(async () =>
{
var entityStream = client.GetEntityInfo(new Request());
await foreach (var entityData in entityStream.ResponseStream.ReadAllAsync())
{
//ProcessEntityData(entityData);
}
});
var eventTask = Task.Run(async () =>
{
var eventStream = client.GetEventsInfo(new Request());
await foreach (var eventData in eventStream.ResponseStream.ReadAllAsync())
{
ProcessEventData(eventData);
}
});
await Task.WhenAll(entityTask, eventTask);
break;
}
catch (Exception ex)
{
Console.WriteLine($"连接失败: {
ex.Message}。{
RetryDelaySeconds}秒后重试...");
retries++;
await Task.Delay(RetryDelaySeconds * 1000);
}
}
if (retries >= MaxRetries)
{
Console.WriteLine("超过最大重试次数,客户端退出。");
}
}
private static void ProcessEntityData(StatusData statusData