grpc文件传输C++代码
时间: 2023-06-28 14:03:55 浏览: 132
以下是一个简单的示例代码,用于在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。
注意:这个示例代码还需要一个服务端实现,可以根据需要自行实现。
阅读全文