欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解如何在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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。