websocket发送protobufjs 数据怎么加上在proto消息上加上自己的信息

在creator中我序列化proto消息后怎么把这些数据和自己的数据一起混在一起发送
比如:
let pb = cc.my.pbkiller.loadFromFile(‘test.proto’);
cc.my.pb = pb;
let player = new pb.UserLogin_CL();
player.id= 1;
player.name = “123”
var data = player.toArrayBuffer(); //Uint8Array

    //我想在data数据前面加上消息号10001 一起通过websocket发送给服务器怎么处理呢???
    

    cc.my.socket.send(data);
            var len = data.byteLength + 2;
            var buf = new Uint8Array(len);
            buf[0] = 10001 % 256;
            buf[1] = 10001 / 256;
            buf.set(data, 2);

            this.sio.send(buf);

你既然使用protobuf来定义协议,就应该按协议规范来。
你可以这样定义协议

message package {
    uint32 id = 1;       //这个就是你说的消息号
    bytes data  = 2;     //这是个二进制,放你的UserLogin_CL 序列化后的二进制数据。
}

每次通信都发送package这个固定的数据结构,下层协议由id来标识

这样的话proto消息直接toBuffer后就可以直接放到 bytes data = 2 这个元素中了吧

是的,你可以封装下你的send函数

this.sio.send(buf);
改成
this.sio.send(id, buf); 

上层代码只关心具体请求和请求参数,send函数封装完整数据包,把toArrayBuffer也放到send函数中去。
这样你的代码会清爽很多

你这问题最后怎么解决的呀,求教

看3楼

message package {
uint32 id = 1; //这个就是你说的消息号
bytes data = 2; //这是个二进制,放你的UserLogin_CL 序列化后的二进制数据。
}

这种方式对吧,我给你单独留了消息帮忙给看看

请问下怎么定义和使用这种格式的消息

proto的定义

enum ActionID {
    USER_LOGIN = 1;
}

message Package {
    uint32 id = 1;       //这个就是你说的消息号
    bytes data  = 2;     //这是个二进制,放你的UserLogin_CL 序列化后的二进制数据。
}

message UserLogin{
   string name = 1;
   string pwd = 2;
}

在js中使用

//实例化登录消息
let userLogin = new UserLogin();
userLogin.name = 'aaa';
userLogin.pwd  = 'aaa';

//实例化数据包,填充上层数据
let pakcage = new Pakcage();
package.id = ActionID.USER_LOGIN;
package.data = userLogin.toArrayBuffer();

//将package序列化发送到服务器
let sendBuffer = package.toArrayBuffer();
socket.send(sendBuffer);

服务器将sendBuffer还原为Package,读出id字段,然后将package.data路由到对应的处理函数!

2赞