详解如何在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 相关文章推荐
绑定回车enter事件代码
May 18 Javascript
js实现横向伸展开的二级导航菜单代码
Aug 28 Javascript
微信小程序 window_x64环境搭建
Sep 30 Javascript
如何使用jquery实现文字上下滚动效果
Oct 12 Javascript
JavaScript中动态向表格添加数据
Jan 24 Javascript
Bootstrap下拉菜单样式
Feb 07 Javascript
Vue异步组件使用详解
Apr 08 Javascript
微信小程序按钮去除边框线分享页面功能
Aug 27 Javascript
Javascript 实现 Excel 导入生成图表功能
Oct 22 Javascript
Preload基础使用方法详解
Feb 03 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
Aug 07 Javascript
JavaScript实现音乐播放器
Aug 14 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解析html的实现代码
2011/08/08 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
PHP代码加密的方法总结
2020/03/13 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
js实现简单秒表走动的时钟特效
2020/03/25 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
NodeJS简单实现WebSocket功能示例
2018/02/10 NodeJs
angular4中引入echarts的方法示例
2019/01/29 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
Python守护进程用法实例分析
2015/06/04 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Pandas的Apply函数具体使用
2020/07/21 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
护士自我评价范文
2014/01/25 职场文书
财务管理专业自荐书
2014/09/02 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
汽车销售合同文本
2019/08/08 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
浅谈Vue的computed计算属性
2022/03/21 Vue.js