我有一个 gRPC 客户端和服务器,当我运行它们时,它们似乎运行良好,但当我尝试使用客户端拨打服务器时出现错误:
"Error": {
"code": 14,
"message": "all SubConns are in TransientFailure"
},
不知道它是什么。我试图找到谷歌的解决方案,但没有成功。
有什么想法吗?这是我的服务器代码:
lis, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.Host, cfg.Port))
if err != nil {
logger.Critical(ctx, "failed to listen: %v", err)
} else {
logger.Info(ctx, "[userserver] running at %s:%d", cfg.Host, cfg.Port)
}
grpcServer := grpc.NewServer()
userServer := userserver.New()
pb.RegisterDomainServer(grpcServer, userServer)
rpcErr := grpcServer.Serve(lis)
if rpcErr != nil {
logger.Critical(ctx, "failed to serve: %v", rpcErr)
}
btw服务器在这里显示log:
2018/02/08 07:03:37.603287 INFO:[userserver]在localhost:3001运行
和客户:
conn, err := grpc.Dial(c.serverAddr, grpc.WithInsecure())
if err != nil {
return err
}
defer conn.Close()
client := pb.NewDomainClient(conn)
_, err = client.Dispatch(ctx, &pb.Command{
Name: command,
Payload: payload,
})
这是port buff
service Domain {
rpc Dispatch(Command) returns (Response);
}
message Command {
string name = 1;
bytes payload = 2;
}
message Response {}
答案 0 :(得分:0)
此错误表示由于某种原因与服务器的连接已关闭。
您正在打印您的服务器在localhost:3001上运行,但不要检查服务器是否在该地址上有任何错误。
将服务器中的最后一行替换为:
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
服务器启动中的上下文ctx
来自哪里?
我假设你的原型定义看起来像那样 - 否则可能还有其他问题:
package ...;
service Domain {
rpc Dispatch(Command) returns (...) {}
}
message Command {
... Name
... Payload
}
答案 1 :(得分:0)
服务器是否正在侦听该端口?
<title>
Hello world.
</title>
<body onload="startTimer()">
<div id="img" class="swapingImages"></div>
</body>
您是否将客户端连接到正确的地址?
c.serverAddr应为&#34; 127.0.0.1:3001&#34;