当前位置: 首页 > 知识库问答 >
问题:

将localhost更改为服务器计算机名或IP时,gRPC客户端调用失败

淳于禄
2023-03-14

我有一个gRPC客户端调用同一台机器上的服务器,并且客户端代码使用使用以下创建的通道:

Channel channel = new Channel("localhost", 11112, ChannelCredentials.Insecure);

这很有效,我得到了预期的回复。

但是,如果我将“localhost”替换为实际的机器名称(FQDN)或IP地址,我会收到一个错误:

Status(StatusCode="Unavailable", Detail="failed to connect to all addresses", DebugException="Grpc.Core.Internal.CoreErrorDetailException: {"created":"@1616190440.553000000","description":"Failed to pick subchannel","file":"..\..\..\src\core\ext\filters\client_channel\client_channel.cc","file_line":5397,"referenced_errors":[{"created":"@1616190440.553000000","description":"failed to connect to all addresses","file":"..\..\..\src\core\ext\filters\client_channel\lb_policy\pick_first\pick_first.cc","file_line":398,"grpc_status":14}]}")

我还测试了在远程机器上启动服务器,并在创建通道时让客户端调用该远程机器(通过名称或IP),但遇到了同样的失败。该应用程序是用C#编写的。NET Core 3.2作为控制台应用程序。包含的Nuget包有:Google.Protobuf、Grpc.Core、Grpc.Tools.

不确定我的代码中有什么问题,或者我的计算机上是否未正确设置某些内容。

以下是相关客户端代码的重置:

MWCS.McpsServer.McpsServerClient client = new MWCS.McpsServer.McpsServerClient(channel);
var data = new ProcessResponseInput() { ClientID = clientID };
var options = new CallOptions();
try {
  var res = client.ProcessResponse(data, options);
  return res;
} catch (RpcException ex) {
  StandardOutput so = new StandardOutput() { ExitCode = 1, Message = ex.Message };
  return so;
}

共有1个答案

徐博雅
2023-03-14

为了解决这个问题,我实际上必须修复服务器代码。我应该在服务器上的绑定地址中使用"0.0.0.0"而不是"localhost"。看起来像是将服务器设置为localhost时,它在计算机外不可见。

以下是我现在如何启动服务器(更换后):

_server = new Server() {
               Services = { McpsServer.BindService(new McpcServerImplementation()) },
               Ports = { new ServerPort("0.0.0.0", 11112, ServerCredentials.Insecure) }
         };
 类似资料:
  • 首先,我想为这个问题发布一些真正的代码,但我不能,因为它的行太多了。也就是说,我的情况如下: 服务器端 我有一个RMI服务器,它等待客户端自己连接和“注册”,以便服务器可以对客户端进行函数调用。基本上,服务器有一个已发布的函数,其工作原理类似于以下伪代码: 客户端 在启动时,Client调用Naming.lookup([url])以获取服务器的存根,我将调用,然后调用。问题发生在服务器的方法的第一

  • 快速免责声明,我是非常新的gRPC和RPC一般,所以请有耐心 对等点列表、是在以前的rpc调用中构建的。 客户 服务器端实现,

  • 我是gRPC的新手,正在尝试使用cactuaroid中的聊天服务器/客户端示例来学习它。我修改了代码,以显示WPF应用程序中长时间运行的任务的进度。所有代码都在.NET5上运行,我使用的是最新版本的gRPC软件包。 使用计算机的IP地址时,该过程工作正常,但是当为gRPC客户端使用计算机名称时,我收到“DNS解析失败”异常(计算机名称为“skylake”): RpcException: Statu

  • 我有一个用。NET核心实现的gRPC服务器,我希望与运行在。NET Framework中的控制台应用程序联系。 我在发送请求时得到以下异常: rpc.core.rpcexception:'statuscode=“不可用”,detail=“DNS解析失败服务:https://localhost:5001”,debugexception=“grpc.core.internal.coreerrordet

  • 我对gRpc很陌生,已经开始探索它们的基础知识(在C语言中)。我想获得有关如何发送心跳以检查客户端/服务器是否仍处于连接状态以及在断开连接时采取恢复措施的指导。任何示例或参考任何文档/文章都将有助于我开始学习。谢谢

  • 我有一个客户端服务器的情况,每一方都在测量时间,但似乎有一个问题,即测量的时间不匹配。长话短说,这个想法是有一个倒计时,之后程序需要做事情。我在服务器端测量这个。但是,倒计时需要显示,所以我所做的是在客户端单独运行它。最终结果是,当服务器发送消息时,客户端显示为23秒,该消息表明时间倒计时为10分钟。 客户端为XNA,代码: 然后从可用时间中减去计时器,并显示出来。在服务器端,这种情况正在发生: