温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Node.js的httpServer中接收前端发送的arraybuffer数据

发布时间:2021-02-07 11:03:35 来源:亿速云 阅读:366 作者:小新 栏目:web开发

这篇文章主要介绍怎么在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数据”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI