如何使用gRPC在客户端和服务器之间双向发送和接收流元数据?

我想使用gRPC进行传输,将文件从客户端传输到服务器,并将文件从服务器传输到客户端。但是,接收过程不知道期望多少字节。我看到了一些建议,将其附加在要传输的数据的开头,然后在从流中接收到第一个块时将其解析出来。但是,如果可能,我想避免这种情况。在gRPC C ++ API中,我看到ClientWriter实现了ClientStreamingInterface并可以使用WaitForInitialMetadata()访问服务器元数据。服务器实现ServerStreamingInterface,并且可以使用SendInitialMetadata()方法发送服务器metadat。

the documentation尚不清楚此元数据包含什么以及如何添加自己的元数据,以便可以在发送之前通知客户端服务器期望的文件大小。

此外,我发现没有简单的方法可以使用gRPC C ++ API通知服务器希望客户端提供多少大小的文件。

当然,我是gRPC和C ++的新手,因此向正确方向的任何指针将不胜感激。

epkaixuan 回答:如何使用gRPC在客户端和服务器之间双向发送和接收流元数据?

这里有一个参考: https://grpc.github.io/grpc/cpp/classgrpc__impl_1_1_client_context.html https://grpc.github.io/grpc/cpp/classgrpc__impl_1_1_server_context.html

还有一个例子: https://github.com/grpc/grpc/blob/master/examples/cpp/metadata/greeter_server.cc

客户端和服务器都可以指定初始元数据,分别在ClientContext和ServerContext上发送。该方法在ClientContext上称为AddMetadata,在ServerContext上称为AddInitialMetadata(以区别于尾随的元数据):

    // AddMetadata (const grpc::string &meta_key,const grpc::string &meta_value)
    context->AddMetadata("custom-server-metadata","initial metadata value");

在这种情况下,值是一个字符串。要指定数字,通常会使用grpc :: to_string:

    context->AddInitialMetadata("filesize",grpc::to_string(file_size));

接收方的元数据格式为

    const std::multimap< grpc::string_ref,grpc::string_ref > &

此类型由ServerContext :: client_metadata()返回(在服务器端获取客户端的初始元数据),并由ClientContext :: GetServerInitialMetadata()返回(在WaitForInitialMetadata()返回后在服务器端的服务器初始元数据)。同步API或其他API中的等效API。

要查找文件大小,可以执行以下操作:

    int filesize = atoi(metadata.find("filesize")->second);

(如果不确定是否指定了“ filesize”,则可能要检查metadata.find(“ filesize”)!= metadata.end())

关于如何发送初始元数据,当您在网上发送RPC时,它会自动在客户端发送。在服务器端,您可以使用SendInitialMetadata()显式发送它,也可以将其与您的第一个服务器一起写入流中。

本文链接:https://www.f2er.com/3108083.html

大家都在问