详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
程序员文章站
2023-01-29 14:36:36
最近使用了protobuf进行数据交互,发送在node.js接收前端的二进制数据出现了数据错误等问题。后来发现思路上面的问题,在req.on('data',()=>{...
最近使用了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);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: es6语法总结