详解如何在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 弹出框口并返回值的两种常用方法
Dec 30 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
Oct 11 Javascript
简单纯js实现点击切换TAB标签实例
Aug 23 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
Nov 17 Javascript
基于JavaScript实现微信抢红包功能
Jul 20 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
Dec 29 Javascript
bootstrap动态调用select下拉框的实例代码
Aug 09 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
Sep 28 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
Jul 19 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
Nov 09 Javascript
Vue多选列表组件深入详解
Mar 02 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
Drupal简体中文语言包安装教程
2014/09/27 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
php生成图片验证码
2015/06/09 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python动态监控日志内容的示例
2014/02/16 Python
Python中DJANGO简单测试实例
2015/05/11 Python
pygame播放音乐的方法
2015/05/19 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
python实现扫描ip地址的小程序
2019/04/16 Python
python3 mmh3安装及使用方法
2019/10/09 Python
Python中zip函数如何使用
2020/06/04 Python
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
出纳岗位职责范本
2013/12/01 职场文书
医院实习接收函
2014/01/12 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
股票投资建议书
2014/05/19 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
活动主持人开场白
2015/05/28 职场文书
少年犯观后感
2015/06/11 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android
Java 写一个简单的图书管理系统
2022/04/26 Java/Android
vue如何清除浏览器历史栈
2022/05/25 Vue.js