详解如何在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 相关文章推荐
Javascript技术技巧大全(五)
Jan 22 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
Jan 15 Javascript
JavaScript 一道字符串分解的题目
Aug 03 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
Jul 18 Javascript
js利用正则表达式检验输入内容是否为网址
Jul 05 Javascript
JavaScript实现弹窗效果代码分析
Mar 09 Javascript
AngularJS全局警告框实现方法示例
May 18 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
Jul 28 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
Jul 26 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
Sep 27 Javascript
简单了解小程序+node梳理登陆流程
Jun 24 Javascript
一文帮你理解PReact10.5.13源码
Apr 03 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
php5中类的学习
2008/03/28 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
javascript间隔刷新的简单实例
2013/11/14 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
python numpy格式化打印的实例
2018/05/14 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
python时间time模块处理大全
2020/10/25 Python
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
酒店个人培训自我鉴定
2013/12/11 职场文书
学校后勤人员职责
2013/12/27 职场文书
机电专业个人求职信范文
2013/12/30 职场文书
国际贸易个人求职信范文
2014/01/04 职场文书
偷看我的初中毕业鉴定
2014/01/29 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
Python first-order-model实现让照片动起来
2022/06/25 Python