重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍怎么在Node.js的httpServer中接收前端发送的arraybuffer数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
成都创新互联公司是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的十余年时间我们累计服务了上千家以及全国政企客户,如公路钻孔机等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致赞誉。
最近使用了protobuf进行数据交互,发送在node.js接收前端的二进制数据出现了数据错误等问题。后来发现思路上面的问题,在req.on('data',()=>{})事件中的处理不适当才引发数据错乱。借此发
我先直接贴正确接收二进制数据代码
const server = http.createServer((req, res) => { if(req.method==='OPTIONS'){ res.setHeader("Access-Control-Allow-Origin", "*"); res.statusCode=200; } if(req.method==='POST'){ // 存储数组空间 let msg=[]; // 接收到数据消息 req.on('data',(chunk)=>{ if(chunk){ msg.push(chunk); } }) // 接收完毕 req.on('end',()=>{ // 对buffer数组阵列列表进行buffer合并返回一个Buffer let buf=Buffer.concat(msg); conosole.log(buf)//提取Buffer正确 }) } }); server.listen(3000,'127.0.0.1');
在nodejs中接收buffer数据需要以数组阵列的方式存储然后通过buffer.concat对数组阵列合并创建新的arraybuffer。这样就正确的接收二进制数据了。
示例二:
以后端传送threejs中的点阵数组为例:
后端:
let buffer = Buffer.alloc((points.length + 4) * 4) //points.length + 4:预留前四个数字为其他信息(比如两个数字为一组,或者三个数字为一组) //预留位置 buffer.writeFloatLE(1, 0) buffer.writeFloatLE(2, 4) buffer.writeFloatLE(3, 8) buffer.writeFloatLE(4, 12) //buffer前四个数为信息 //point数据从第16位开始写入 for (let i = 0, len = points.length; i < len; i++) { buffer.writeFloatLE(points[i], i * 4 + 16) } res.send(buffer)
前端:
let pointXhr = new XMLHttpRequest() pointXhr.onreadystatechange = function () { var DONE = pointXhr.DONE || 4; if (pointXhr.readyState === DONE) { let buffer = pointXhr.response let bufferArray = new Float32Array(buffer); for (var i = 0; i < buffer.length; ++i) { bufferArray[i] = buffer[i]; } let pointsArray = bufferArray.slice(4) let points = [] //pointsArray 点阵从第5个开始(前四个数为其他信息) for (let i = 0, l = pointsArray.length / 3; i < l; i++) { points.push({ x: pointsArray[i * 3], y: pointsArray[i * 3 + 1], z: pointsArray[i * 3 + 2] }) } callback(points) } } pointXhr.open("POST",url,true); pointXhr.responseType = 'arraybuffer'; pointXhr.send(null);
前端接收图片buffer
let imageXhr = new XMLHttpRequest() imageXhr.onreadystatechange = function () { var DONE = imageXhr.DONE || 4; if (imageXhr.readyState === DONE) { if (imageXhr.response) { let bufferArray = imageXhr.response let uint8Array = new Uint8Array(bufferArray); for (var i = 0; i < bufferArray.length; ++i) { uint8Array[i] = bufferArray[i]; } callback(uint8Array) } } } imageXhr.open("POST",url,true); imageXhr.responseType = 'arraybuffer'; imageXhr.send(null);
以上是“怎么在Node.js的httpServer中接收前端发送的arraybuffer数据”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!