91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Node.js的httpServer中接收前端發送的arraybuffer數據

發布時間:2021-02-07 11:03:35 來源:億速云 閱讀:322 作者:小新 欄目: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

手游| 伊川县| 鄢陵县| 来凤县| 合川市| 兴海县| 师宗县| 大荔县| 册亨县| 清流县| 基隆市| 乌拉特前旗| 五寨县| 个旧市| 阿拉尔市| 乐至县| 安吉县| 客服| 益阳市| 陵水| 高要市| 靖远县| 丰顺县| 连南| 酉阳| 文化| 景宁| 乌兰县| 景谷| 广安市| 崇仁县| 海盐县| 秦皇岛市| 喀什市| 车致| 灵山县| 丰镇市| 陕西省| 冷水江市| 铜陵市| 乌什县|