使用c++如何实现在gRPC中传输文件

使用c++实现gRPC远程调用框架中传输文件,proto文件如下:

syntax = "proto3";
package transferfile;
service TransferFile {
    rpc Upload(stream Chunk) returns (Reply) {}
}
message Chunk {
    bytes buffer = 1;
}
message Reply {
    int32 length = 1;
}

对应的c++代码如下:

client端:

#include <iostream>
#include <string>
#include <fstream>
#include <sys/time.h>
#include <grpc/grpc.h>
#include <grpc++/channel.h>
#include <grpc++/client_context.h>
#include <grpc++/create_channel.h>
#include <grpc++/security/credentials.h>
#include "transfer_file.grpc.pb.h"
using grpc::Channel;
using grpc::ClientContext;
using grpc::ClientWriter;
using grpc::Status;
using transferfile::Chunk;
using transferfile::Reply;
using
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,用于在C++使用gRPC进行文件传输: ```c++ #include <grpcpp/grpcpp.h> #include <grpcpp/create_channel.h> #include <grpcpp/security/credentials.h> #include <fstream> #include <iostream> #include "filetransfer.grpc.pb.h" using grpc::Channel; using grpc::ClientContext; using grpc::Status; using filetransfer::FileRequest; using filetransfer::FileReply; using filetransfer::FileTransfer; class FileTransferClient { public: FileTransferClient(std::shared_ptr<Channel> channel) : stub_(FileTransfer::NewStub(channel)) {} bool SendFile(const std::string& file_path) { std::ifstream file(file_path, std::ios::in | std::ios::binary); if (!file.is_open()) { std::cerr << "Failed to open file: " << file_path << std::endl; return false; } std::cout << "Sending file: " << file_path << std::endl; FileRequest request; request.set_file_name(file_path.substr(file_path.find_last_of("/") + 1)); char buffer[1024]; while (file.read(buffer, sizeof(buffer))) { request.set_file_content(buffer, sizeof(buffer)); ClientContext context; FileReply reply; Status status = stub_->SendFile(&context, request, &reply); if (!status.ok()) { std::cerr << "Failed to send file: " << status.error_message() << std::endl; return false; } } if (file.gcount() > 0) { request.set_file_content(buffer, file.gcount()); ClientContext context; FileReply reply; Status status = stub_->SendFile(&context, request, &reply); if (!status.ok()) { std::cerr << "Failed to send file: " << status.error_message() << std::endl; return false; } } std::cout << "File sent successfully!" << std::endl; return true; } private: std::unique_ptr<FileTransfer::Stub> stub_; }; int main(int argc, char** argv) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " <file_path>" << std::endl; return 1; } grpc::RegisterDefaultGrpcLibrary(); std::string server_address("localhost:50051"); FileTransferClient client(grpc::CreateChannel( server_address, grpc::InsecureChannelCredentials())); client.SendFile(argv[1]); return 0; } ``` 这个示例代码包括一个`FileTransferClient`类,它使用gRPC发送文件到服务器。主要的方法是`SendFile()`,它接受一个文件路径作为参数,并将该文件发送到服务器。 在`SendFile()`方法,首先打开文件并检查是否成功。然后,创建一个`FileRequest`对象,并将文件名和缓冲区填充到文件内容使用`ClientContext`对象发送请求,等待响应,如果出现错误则返回false。最后,关闭文件并返回true。 注意:这个示例代码还需要一个服务端实现,可以根据需要自行实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值