Web services gRPC中如何将数据从客户端发送到(多服务)服务器

Web services gRPC中如何将数据从客户端发送到(多服务)服务器,web-services,protocol-buffers,grpc,protobuf-c,Web Services,Protocol Buffers,Grpc,Protobuf C,我正在我的一个应用程序(语音识别)中使用gRPC客户机-服务器框架。有几件重要的事情我想用我的观察来澄清 1。当客户端未填充可选数据字段时,如何发送该字段? 让我们看看下面的示例:(假设使用proto3,因此默认情况下所有字段都是可选的) 假设服务接受(来自客户端的输入)一些学生的详细信息,比如名单、姓名和年龄,然后返回该学生的(全部)详细信息 因此,现在,如果不发送所有3个详细信息(即卷名、姓名和年龄),甚至可以发送任何一个或两个详细信息,并且(逻辑上假设)服务可以工作 在这种情况下,服务器会

我正在我的一个应用程序(语音识别)中使用gRPC客户机-服务器框架。有几件重要的事情我想用我的观察来澄清

1。当客户端未填充可选数据字段时,如何发送该字段?

让我们看看下面的示例:(假设使用proto3,因此默认情况下所有字段都是可选的)

假设服务接受(来自客户端的输入)一些学生的详细信息,比如名单、姓名和年龄,然后返回该学生的(全部)详细信息

因此,现在,如果不发送所有3个详细信息(即卷名、姓名和年龄),甚至可以发送任何一个或两个详细信息,并且(逻辑上假设)服务可以工作

在这种情况下,服务器会接收所有字段(省略的字段为空白/空),还是客户端根本不发送该省略的信息?(请参见下面从客户端发送的二进制数据的表示)

//only roll and name is sent and rest is just not sent
{
    roll: 170012,
    name: "John Doe"
}
2。可以为两个服务连接单个存根吗?


如果服务器提供2项服务,而我正在制作一个客户端存根,我是否能够将来自同一存根的2个通道连接到同一台服务器,以访问它的2项不同服务?

问题1

看一看。特别是:

对于proto3中的任何非重复字段,或proto2中的可选字段, 编码的消息可能有,也可能没有与之对应的键值对 字段号

但在实践中,我注意到在序列化中省略了带有默认值的可选字段。当protobuf被反序列化时,解析器将把缺少的字段解释为默认值。您可以在Python protobuf对象上使用
SerializeToString()
方法来观察这种行为

问题2


完全可以将多个gRPC服务连接到同一台服务器,并从同一客户端通道与多个服务交互。gRPC用于区分连接到同一服务器的多个服务。请看一个例子
add_GreeterServicer\u to_server
将用户定义的处理程序与路径
/helloworld.Greeter/SayHello
关联,然后存根使用该路径识别服务器上的服务。

问题1

看一看。特别是:

对于proto3中的任何非重复字段,或proto2中的可选字段, 编码的消息可能有,也可能没有与之对应的键值对 字段号

但在实践中,我注意到在序列化中省略了带有默认值的可选字段。当protobuf被反序列化时,解析器将把缺少的字段解释为默认值。您可以在Python protobuf对象上使用
SerializeToString()
方法来观察这种行为

问题2


完全可以将多个gRPC服务连接到同一台服务器,并从同一客户端通道与多个服务交互。gRPC用于区分连接到同一服务器的多个服务。请看一个例子
add_GreeterServicer\u to_server
将用户定义的处理程序与路径
/helloworld.Greeter/SayHello
相关联,然后存根使用该路径来标识服务器上的服务。

Hey@Richard很好地起草了答案(向上投票)。我已经得到了问题的答案,但是理解你在回答2中分享的例子会有帮助。我不是python爱好者,所以我会尽我最大的努力一步一步地学习这个例子。同时,如果你能/想补充更多的解释,请这样做。。。再次感谢@Richard很好地起草了答案(请投赞成票)。我已经得到了问题的答案,但是理解你在回答2中分享的例子会有帮助。我不是python爱好者,所以我会尽我最大的努力一步一步地学习这个例子。同时,如果你能/想补充更多的解释,请这样做。。。再次感谢
// roll and name filled
// age is left blank
// gender and DOB are always sent blank from client
{
    roll: 170012,
    name: "John Doe",
    age: ,
    gender: "",
    dateofbirth: {
           dd: ,
           mm: ,
           yy: 
    }
}
//only roll and name is sent and rest is just not sent
{
    roll: 170012,
    name: "John Doe"
}