详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据


Posted in Javascript onNovember 11, 2018

最近使用了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);

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

Javascript 相关文章推荐
PPK 谈 JavaScript 的 this 关键字 [翻译]
Sep 29 Javascript
JQuery里选择超链接的实现代码
May 22 Javascript
jQuery中读取json文件示例代码
May 10 Javascript
div模拟选择框示例代码
Nov 03 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
Nov 29 Javascript
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
Jul 10 Javascript
关于vue-router的beforeEach无限循环的问题解决
Sep 09 Javascript
基于element-ui的rules中正则表达式
Sep 04 Javascript
从源码里了解vue中的nextTick的使用
Nov 22 Javascript
微信小程序错误this.setData报错及解决过程
Sep 18 Javascript
基于Vue实现图片在指定区域内移动的思路详解
Nov 11 #Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
Nov 11 #Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 #Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 #Javascript
AngularJS上传文件的示例代码
Nov 10 #Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 #Javascript
优雅的在React项目中使用Redux的方法
Nov 10 #Javascript
You might like
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
python对DICOM图像的读取方法详解
2017/07/17 Python
python实现ID3决策树算法
2017/12/20 Python
简单实现python画圆功能
2018/01/25 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python文件写入write()的操作
2019/05/14 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
到底Java是如何传递参数的?是by value或by reference?
2012/07/13 面试题
决心书标准格式
2014/03/11 职场文书
结对共建工作方案
2014/06/02 职场文书
小学假期安全广播稿
2014/09/28 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
2016年春节慰问信息
2015/03/25 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
go类型转换及与C的类型转换方式
2021/05/05 Golang