詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)
最近使用了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)始寫(xiě)入
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);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Windows系統(tǒng)下Node.js的簡(jiǎn)單入門(mén)教程
這篇文章主要介紹了Windows系統(tǒng)下Node.js的簡(jiǎn)單入門(mén)教程,Node.js是用于后端編程的JavaScript框架,需要的朋友可以參考下2015-06-06
基于Node.js的強(qiáng)大爬蟲(chóng) 能直接發(fā)布抓取的文章哦
基于Node.js的強(qiáng)大爬蟲(chóng)能直接發(fā)布抓取的文章哦!本爬蟲(chóng)源碼基于WTFPL協(xié)議,感興趣的小伙伴們可以參考一下2016-01-01
詳解nodejs解壓版安裝和配置(帶有搭建前端項(xiàng)目腳手架)
這篇文章主要介紹了詳解nodejs解壓版安裝和配置(帶有搭建前端項(xiàng)目腳手架) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
node.js中的fs.createReadStream方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.createReadStream方法使用說(shuō)明,本文介紹了fs.createReadStream方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
從零開(kāi)始學(xué)習(xí)Node.js系列教程四:多頁(yè)面實(shí)現(xiàn)的數(shù)學(xué)運(yùn)算示例
這篇文章主要介紹了Node.js多頁(yè)面實(shí)現(xiàn)的數(shù)學(xué)運(yùn)算,涉及nodejs請(qǐng)求響應(yīng)、數(shù)值傳遞、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
基于Node.js構(gòu)建一個(gè)靈活的CLI命令行工具
在軟件開(kāi)發(fā)中,命令行界面(CLI)工具是必不可少的助手,本文主要介紹了如何使用Node.js構(gòu)建一個(gè)靈活的CLI工具,涵蓋從基礎(chǔ)命令處理到復(fù)雜的交互式問(wèn)答和遠(yuǎn)程模板下載,需要的可以參考下2024-03-03
從零學(xué)習(xí)node.js之express入門(mén)(六)
相信大家都知道Express是一個(gè)簡(jiǎn)潔而靈活的 node.js Web應(yīng)用框架, 提供了一系列強(qiáng)大特性幫助你創(chuàng)建各種 Web 應(yīng)用,和豐富的 HTTP 工具。下面這篇文章主要介紹了node.js中express的入門(mén)知識(shí),需要的朋友可以參考下。2017-02-02
Nodejs極簡(jiǎn)入門(mén)教程(二):定時(shí)器
這篇文章主要介紹了Nodejs極簡(jiǎn)入門(mén)教程(二):定時(shí)器,本文講解了setTimeout、setInterval、setImmediate及process.nextTick等內(nèi)容,需要的朋友可以參考下2014-10-10

