详解如何在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 相关文章推荐
一个tab标签切换效果代码
Mar 27 Javascript
jquery制作图片时钟特效
Mar 30 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
Nov 07 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
js实现上下左右弹框划出效果
Mar 08 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
vue项目中axios使用详解
Feb 07 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
May 13 Javascript
uni-app之APP和小程序微信授权方法
May 09 Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 Javascript
vue 把二维或多维数组转一维数组
Apr 24 Vue.js
基于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
获取远程文件大小的php函数
2010/01/11 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
windows8.1下Apache+Php+MySQL配置步骤
2015/10/30 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python实现将xml导入至excel
2015/11/20 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
求职简历中个人的自我评价
2013/12/25 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
乔迁宴答谢词
2014/01/21 职场文书
2014年元旦感言
2014/03/06 职场文书
实习工作表现评语
2014/12/31 职场文书
十八大观后感
2015/06/12 职场文书
小学科学课教学反思
2016/02/23 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
用Python生成会跳舞的美女
2022/01/18 Python