C# 无法连接到Linux计算机上的GRPC服务
我已经编写了一个充当服务器的GRPC.NET Core Worker服务和一个充当GRPC客户端的.NET Core控制台应用程序。两者都遵循使用helloworld.proto文件的教程,但我扩展了它们,以便服务器可以在一台计算机上,客户端可以在另一台计算机上 服务器如下所示:C# 无法连接到Linux计算机上的GRPC服务,c#,linux,.net-core,grpc,opensuse,C#,Linux,.net Core,Grpc,Opensuse,我已经编写了一个充当服务器的GRPC.NET Core Worker服务和一个充当GRPC客户端的.NET Core控制台应用程序。两者都遵循使用helloworld.proto文件的教程,但我扩展了它们,以便服务器可以在一台计算机上,客户端可以在另一台计算机上 服务器如下所示: class GreeterImpl : Greeter.GreeterBase { // Server side handler of the SayHello RPC public override
class GreeterImpl : Greeter.GreeterBase
{
// Server side handler of the SayHello RPC
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
}
}
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private const int PORT = 5221;
private Server m_Server;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Starting grpc...");
_logger.LogInformation("Local machine name: {computer}, Port: {port}", Environment.MachineName, PORT);
m_Server = new Server
{
Services = { Greeter.BindService(new GreeterImpl()) },
Ports = { new ServerPort(Environment.MachineName, PORT, ServerCredentials.Insecure) }
};
m_Server.Start();
return base.StartAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Shutting down...");
m_Server.ShutdownAsync().Wait();
return base.StopAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
//_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter the server IP address or name:");
string server = Console.ReadLine();
Console.WriteLine($"The server entered was: {server}");
Channel channel = new Channel(string.Format("{0}:5221", server), ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
string user = "you";
var reply = client.SayHello(new HelloRequest { Name = user });
Console.WriteLine("Greeting: " + reply.Message);
channel.ShutdownAsync().Wait();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
在这种情况下,他们使用端口5221进行连接
我已成功运行该程序:
- Windows计算机上的服务器,不同Windows计算机上的客户端
- Windows计算机上的服务器,opensuse linux计算机上的客户端
- 同一台opensuse linux计算机上的服务器和客户端
linux和Windows计算机可以通过名称和ip地址相互ping。端口5221在linux计算机上打开。我不是linux大师,我认为这是运行服务器时该计算机上的一些网络问题。有人有什么想法吗?您是否确保端口5221对linux机器上的连接开放?尝试运行“测试网络连接{host}-端口5221”进行测试。如果没有,您需要配置防火墙。@TylerE您最终成功地在linux作为服务器,windows作为客户端的情况下运行了您的程序吗?@tube builder没有,我永远也找不到它,于是放弃了它。@TylerE以防您仍然需要它,多亏了stack exchange的unix/linux部分,我现在已经在Windows上成功地运行了我的客户端,同时在linux上运行了服务,请检查我的问题。也许也会给你一些想法。你是否确保端口5221对linux机器上的连接开放?尝试运行“测试网络连接{host}-端口5221”进行测试。如果没有,您需要配置防火墙。@TylerE您最终成功地在linux作为服务器,windows作为客户端的情况下运行了您的程序吗?@tube builder没有,我永远也找不到它,于是放弃了它。@TylerE以防您仍然需要它,多亏了stack exchange的unix/linux部分,我现在已经在Windows上成功地运行了我的客户端,同时在linux上运行了服务,请检查我的问题。也许也会给你一些想法。