您好,登錄后才能下訂單哦!
這篇文章主要介紹怎么在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
最近使用了protobuf進(jìn)行數(shù)據(jù)交互,發(fā)送在node.js接收前端的二進(jìn)制數(shù)據(jù)出現(xiàn)了數(shù)據(jù)錯(cuò)誤等問題。后來發(fā)現(xià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ǔ)然后通過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位開始寫入 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è)開始(前四個(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);
以上是“怎么在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。