使用protobuf实现任意文件的传输

可以使用proto中的bytes数据类型,将一个文件写入到bytes字段,然后传输,收到数据后,重新抽取bytes,组装成文件

proto文件

syntax = "proto3";

package gs.gmapping;
import "sensor.proto";

service Mapping {
    rpc GetMappingResultFromFramePackageToFilePackage(FramePackage) returns (FilePackage) {}
}

message FramePackage {
    repeated gs.sensor.Frame frame = 1;
}

message FilePackage{
    repeated File file = 1;
}

message File{
    string filename = 1;
    uint32 size = 2;
    bytes data = 3;
}

server端:

打开文件,并从文件读取数据,填充到bytes

        ifstream tmpfile(data_file, ios::in | ios::binary | ios::ate);
        if (tmpfile.is_open()) {
            size_t length = tmpfile.tellg();
            cout << data_file << " size: " << length << endl;
            tmpfile.seekg(0, ios::beg);
            char *data = new char[length];
            tmpfile.read(data, length);
            File *file = file_pkg->add_file();
            file->set_filename(data_file);
            file->set_data(data, length);
            file->set_size(length);
            delete data;
            tmpfile.close();
        } else {
            cerr << data_file << " open failed" << endl;
            return -1;
        }

client端数据获取

读取proto格式数据,并将之读取到数组中,并回写文件

for (File file : file_pkg.file()) {
            string local_str = CopyFileName(file.filename());
            cout << "filename: " << local_str << endl;

//            cout << "size: " << file.size() << endl;
            ofstream tmpFile;
            tmpFile.open(local_str);
            if (tmpFile.is_open()) {
                int length = file.size();
                char *data = new char[length];
                for (int i = 0; i < length; ++i) {
                    data[i] = (char) file.data()[i];
                }
                tmpFile.write(data, length);
                tmpFile.close();
                delete data;
                cout << "write " << local_str << endl;
            }
        }

PS: 若各位有更好的想法,欢迎提出

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值