- Creator 版本号:1.4.2
目前用socket-io传输protobuf,用了较为新的protobuf生成了unit8array数组,但是这个数组传输到服务器后变成了Object导致解析失败。
调查了一下原因,socket-io会检测发送的数据是不是buffer,但是检测使用的判断是是否为ArrayBuffer,但是,传入的是unit8array,所以socket-io把它当成字符串处理了。。。
creater的socket-io似乎也没有办法修改代码。。。
请教这个要怎么解决呢?
creater的socket-io似乎也没有办法修改代码。。。
请教这个要怎么解决呢?
onMessage: function(data) {
let bufferArray = new Uint8Array(data);
var msg = protobufjs.decode(bufferArray);
// todo
},
这个是对从服务器返回的ArrayBuffer进行格式化的操作,我现在也是这么用。但是,我的问题是发送数据部分。
function json2protobuf(payload, msg) {
const errMsg = msg.verify(payload);
if (errMsg) {
console.log("json2protobuf : " + errMsg);
return false;
}
return msg.encode(msg.create(payload)).finish();
}
这个函数最终返回的是Uint8Array,并非ArrayBuffer。这样才导致了Socket-io把它识别为字符串。我尝试使用Uint8Array.buffer,但是似乎传送给了服务器一个很大的错误数据。最后,使用了如下方案‘骗’过了Socket-io,但是,Native能不能用还在测试。不知道各位大大,有没有什么正确的方案。。。
function json2protobuf(payload, msg) {
const errMsg = msg.verify(payload);
if (errMsg) {
console.log("json2protobuf : " + errMsg);
return false;
}
const data = msg.encode(msg.create(payload)).finish();
const blobData = new Blob([data]);
return blobData;
}
import protojs = require('protobufjs');
import { logger } from './../../utils/logger';
let root = protojs.loadSync(__dirname + '../../../../proto/base.proto');
function formatBuffer(buffer) {
var bufferArray = Object.keys(buffer).map(function(k) {
return buffer[k];
})
return bufferArray
}
export module protobufjs {
export let encode = function(payload: any) {
let protoMsg = root.lookupType('base.MessagePkg');
var errMsg = protoMsg.verify(payload);
if (errMsg) {
logger.error(errMsg);
return [];
}
let msg = protoMsg.create(payload);
let buffer = protoMsg.encode(msg).finish();
return buffer;
}
export let decode = function(buffer: any) {
let protoMsg = root.lookupType('base.MessagePkg');
buffer = formatBuffer(buffer);
let msg = protoMsg.decode(buffer);
return msg;
}
}