使用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: 若各位有更好的想法,欢迎提出

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
protobuf中,可以使用protobuf.js来实现文件传输。后端可以通过引入npm的protobuf模块,将json数据转换成协议二进制格式,然后传输到前端。前端可以使用XMLHttpRequest来接收数据,并使用protobuf.js进行解析。这样可以大大提高传输效率。\[1\] 另外,Protocol Buffers还可以很好地解决JSON数据在传输方面的不足。它是一种由Google开发的数据描述语言,类似于XML,可以将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台,并且具有很强的可扩展性。\[2\] 在protobuf中,可以使用唯一的id(数字)来代替复杂的key,这样只要数据发送方和数据接收方都利用同一套模板文件来解析,就可以大大提高传输效率。同时,ProtoBuf.js是基于ByteBuffer.js的Protocol Buffers纯Javascript实现,可以解析.proto文件,构建message类,并进行简单的编码和解码操作。\[2\] 因此,通过使用protobuf.js和Protocol Buffers,可以实现文件的高效传输和解析。 #### 引用[.reference_title] - *1* *2* *3* [protobuf高效传输](https://blog.csdn.net/u013929284/article/details/72582215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值