1、主要原因
这是因为在不同的环境中,protobuf 序列化和传输的方式可能有所不同。Netty 中使用 protobuf 时,会使用特定的编解码器来处理消息的序列化和反序列化,这些编解码器通常会将消息的长度信息添加到消息的前面,以便接收方能够正确地解析消息。
而在 JavaScript 中,protobuf 库没有默认地添加消息长度信息,而是期望开发者自行处理消息的长度和边界。因此,在 JavaScript 中使用 protobuf 时,需要自己处理消息的长度信息
2、解决
后端服务端不需要动,只需要在JS客户端的接收和发送前对消息的二进制长度自行更改
发送消息:
//_msg是protobuf消息体
var smr = _msg.serializeBinary();
//将数据转为二进制,并且将长度加一位
var buf = new Uint8Array(smr.length+1);
//在二进制第一位设置长度
buf[0] = smr.length;
//在第2位开始后设置原数据
buf.set(smr,1);
//发送数据
client.write(buf);
接收消息:
//将获取到的数据转为二进制
var buf = new Uint8Array(data);
//将二进制数据的第一位删除
const buf2 = buf.slice(1);
//解析数据
let message = proto.Message.deserializeBinary(buf2);