详解如何在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 相关文章推荐
jquery下利用jsonp跨域访问实现方法
Jul 29 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
Jan 13 Javascript
js arguments对象应用介绍
Nov 28 Javascript
JS取文本框中最小值的简单实例
Nov 29 Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 Javascript
项目中常用的JS方法整理
Jan 30 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
Oct 27 Javascript
浅谈Angular的$q, defer, promise
Dec 20 Javascript
ES6中Symbol类型用法实例详解
Apr 06 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 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 日常开发小技巧
2009/09/23 PHP
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
php session的锁和并发
2016/01/22 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php实现登陆模块功能示例
2016/10/20 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
浅谈javascript中的作用域
2012/04/07 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python 多线程Threading初学教程
2017/08/22 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
python3中布局背景颜色代码分析
2020/12/01 Python
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
三峡导游词
2015/01/31 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
Python常遇到的错误和异常
2021/11/02 Python