cocos creator + websocket + protobuf

第一次发帖。问题是,在客户端接收到服务器数据时,是二进制字符串,是不是应该先转成arraybuf,然后通过dataview来按格式取数据。服务器组包,是一个2字节的表示包体长度 + 4字节的int + 4字节int + protobuf打包数据,现在是在转二进制字符串的时候通过打印,看到是自己要的数据,但是通过dataview取数据时,不知道是否操作有误,取不出想要的结果

1赞


这是我的操作,有没有接过类似协议的大神,解答一下,或者给份参考

如果是使用protobuf可以看下这里:
https://mp.weixin.qq.com/s?__biz=MzA5MjEwOTI4Ng==&mid=100000034&idx=1&sn=73e17f38fab5485abb7d6e5a2575d24d&scene=19#wechat_redirect

这里有一个protobufjs的demo
https://github.com/ShawnZhang2015/grace

额 就像你说的dataview接受一个arraybuffer啊 你的这个Received里 直接把buf传过来了,这个buf是arraybuffer的类型?

var buffer = new ArrayBuffer(16);

// Create a couple of views
var view1 = new DataView(buffer);
var view2 = new DataView(buffer,12,4); //from byte 12 for the next 4 bytes
view1.setInt8(12, 42); // put 42 in slot 12

console.log(view2.getInt8(0));
// expected output: 42// 

谢谢,我研究下看有没有我要找的东西

是的。我是直接转完之后当做函数传过来了,这个操作不对?

这个buf是 Uint8Array吗?如果是的话 取他的.buffer传入dataview 好久没写了 记不清楚了

这个类型有int16和int32两种

收到服务器数据
首先要做解包,按照约定的包格式去解,解完以后,再把实际proto消息体反序列化(前提客户端已经做了proto相关)
相关链接
这个是cocos解包二进制数据的类
规则已经表明,你可以按照我这个改下

你客户端解包的规则就是
1.先取出2个字节的消息长度,验证长度时候跟剩余的匹配,
2.再取出2个4字节的int,最后剩下的就是消息体
3.剩下的消息体做proto反序列化,得到的就是正确的proto数据类

我上边发的长度是int,所以你可以把这个改为2字节的short,最后再读取2次int

我看了下,他是默认每条消息过来就是个完整的包么?好像没有那种取包头包尾的操作,消息过来直接就用protobuf decode去解包了

链接打不开:joy:

我服务器有点慢,等等,哈哈
还有就是,你收到的服务器的数据如果是二进制的那么就是一个ArrayBuffer

不是慢是404了,我在看别人有说,收到数据要区分原生非原生,有时候是二进制字符串,有时候是blob。我用console去打印类型的时候,返回的是字符串类型,所以我就当做二进制字符串去解了

大佬还在么,或者给个私聊方式

在呢,你是不是去我博客回复的那个人呢?现在链接可以下了,本来服务器过滤了

是的,是我,能给个私聊方式么,有点细节的问题想请教一下

一回来的直接就是arraybuffer的吧,还要设置吗

还没解决??