最近使用了protobuf進(jìn)行數(shù)據(jù)交互,發(fā)送在node.js接收前端的二進(jìn)制數(shù)據(jù)出現(xiàn)了數(shù)據(jù)錯(cuò)誤等問(wèn)題。后來(lái)發(fā)現(xiàn)思路上面的問(wèn)題,在req.on('data',()=>{})事件中的處理不適當(dāng)才引發(fā)數(shù)據(jù)錯(cuò)亂。借此發(fā)
我先直接貼正確接收二進(jìn)制數(shù)據(jù)代碼
const server = http.createServer((req, res) => {    if(req.method==='OPTIONS'){      res.setHeader("Access-Control-Allow-Origin", "*");      res.statusCode=200;    }    if(req.method==='POST'){     // 存儲(chǔ)數(shù)組空間     let msg=[];     // 接收到數(shù)據(jù)消息     req.on('data',(chunk)=>{      if(chunk){       msg.push(chunk);      }     })     // 接收完畢     req.on('end',()=>{      // 對(duì)buffer數(shù)組陣列列表進(jìn)行buffer合并返回一個(gè)Buffer      let buf=Buffer.concat(msg);      conosole.log(buf)//提取Buffer正確     })         }  });server.listen(3000,'127.0.0.1');在nodejs中接收buffer數(shù)據(jù)需要以數(shù)組陣列的方式存儲(chǔ)然后通過(guò)buffer.concat對(duì)數(shù)組陣列合并創(chuàng)建新的arraybuffer。這樣就正確的接收二進(jìn)制數(shù)據(jù)了。
示例二:
以后端傳送threejs中的點(diǎn)陣數(shù)組為例:
后端:
let buffer = Buffer.alloc((points.length + 4) * 4)//points.length + 4:預(yù)留前四個(gè)數(shù)字為其他信息(比如兩個(gè)數(shù)字為一組,或者三個(gè)數(shù)字為一組) //預(yù)留位置buffer.writeFloatLE(1, 0)buffer.writeFloatLE(2, 4)buffer.writeFloatLE(3, 8)buffer.writeFloatLE(4, 12)//buffer前四個(gè)數(shù)為信息//point數(shù)據(jù)從第16位開(kāi)始寫入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 點(diǎn)陣從第5個(gè)開(kāi)始(前四個(gè)數(shù)為其他信息)    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);前端接收?qǐng)D片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);            
新聞熱點(diǎn)
疑難解答
圖片精選