详解如何在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 相关文章推荐
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
Apr 29 Javascript
JS通过Cookie判断页面是否为首次打开
Feb 05 Javascript
轻松搞定jQuery.noConflict()
Feb 15 Javascript
jQuery实现联动下拉列表查询框
Jan 04 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
Mar 23 jQuery
bootstrap栅格系统示例代码分享
May 22 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
JS实现图片居中悬浮效果
Dec 25 Javascript
全新打包工具parcel零配置vue开发脚手架
Jan 11 Javascript
再谈Angular4 脏值检测(性能优化)
Apr 23 Javascript
vue实现的下拉框功能示例
Jan 29 Javascript
Preload基础使用方法详解
Feb 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
利用PHP实现短域名互转
2013/07/05 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
jQuery 解析xml文件
2009/08/09 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
python 将有序数组转换为二叉树的方法
2019/03/26 Python
python让函数不返回结果的方法
2020/06/22 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
土木工程师岗位职责
2013/11/24 职场文书
活动总结报告范文
2014/05/04 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
商铺门面租房协议书
2014/10/21 职场文书
教师党员整改措施
2014/10/24 职场文书
保证书格式
2015/01/16 职场文书
第一节英语课开场白
2015/06/01 职场文书
如何使用python包中的sched事件调度器
2022/04/30 Python
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript
详解flex:1什么意思
2022/07/23 HTML / CSS