cocos creator 使用websocket二进制传输问题请教???

首先说明下情况,为什么用二进制而且没用protobuf?因为老项目就是用的这个,服务器不想动,只是前端用creator重写。
目前搭建通信这块遇到几个问题,而且网上找了很久没有找到。
1:前端的消息体(json格式)需要转换成二进制的时候,需要创建一个this.mBytes=new ArrayBuffer(blockSize),用来存储数据,这个blockSize网上都是写死的固定大小,有没有办法严谨一点,根据传输的数据大小来设定这个blockSize的值。具体怎么操作?

2:当后端消息后来,后端给的arraybuffer二进制数据,我怎么解析,还有就是我发给后端的arraybuffer后端收到二进制的时候怎么解析。是不是要订一套前后端的解析逻辑?

有源码的大神或者懂二进制写法的大神帮小弟解惑下。

1赞

来人啊 求解!!!

需要前后端确定一下序列化-反序列化的规范

1这个问题,在序列化时,你需要计算一下你这个json转换后具体需要的字节数是多少。
2这个问题,是这样解决的,二进制数据的开头几个字节表示如何去解析(一般都是标记个id),其余部分表示数据体。

如果我直接this.mBytes=new ArrayBuffer(10240);这样操作 是不是每次消息发出去都是固定的10kb大小?如果要解析发送的数据大小,感觉很麻烦。而且每次发送都解析消耗性能,有没有什么好的方法?

可以参考我的框架中的enet模块enet
可以自定义协议层处理(自定义二进制解析可以参考一下)
默认使用websocket,也可以自定义socket

关于自定义的可以参考

  1. enet-pbws 基于protobuf的自定义
  2. enet-pinus-pb 基于pinus(pomelo)的协议解析自定义

如果操作二进制的话,我的库里也提供了方便的工具进行操作
如有疑问,我也可以解答

protobuf就是你提到的"前后端的解析逻辑"的一部分,也是上边朋友提到的序列反序列规范的一种。
你提到说服务器不想动,前端重写,那重写之前用什么现在就用什么呗?

之前是socket不是websocket。而且是用lua写的。所以我这边要重写,之前写的也看的不太懂

主要看协议编码和解码部分的逻辑就好了。
但后端不重写是不太可能的了。因为socket变了,后端可能要使用对应的websocket库来和你对接,不然会有问题,看他使用什么语言

之前我的后端就是个erlang,他用tcp去解析我websocket发的数据,就需要联调

CStruct.ts.zip (4.3 KB)

示例:
结构体套结构体
export class CMD_GR_MobileUserScore {
dwUserID = 0;
userScore = new tagUserScore();
}

结构体一维数组,靠desc描述对象类型
export class CMD_GR_TableInfo {
wTableCount = 0;
tableStatus = new Array(512);
tableStatus_desc(){
return { type:tagTableStatus }
}
}

解码:
let pBuffer = new Uint8Array(event.data);
data_bytes = [].slice.call(pBuffer);
let ret = new CMD_GR_MobileUserScore();
CStruct.init(ret, data_bytes);

编码发送
let data_bytes = CStruct.getDataBytes(ret);
let array_buffer = new Uint8Array(data_bytes);
this.socket.send(array_buffer);