详解如何在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 相关文章推荐
20款非常优秀的 jQuery 工具提示插件 推荐
Jul 15 Javascript
jquery垂直公告滚动实现代码
Dec 08 Javascript
Javascript的严格模式strict mode详细介绍
Jun 06 Javascript
jquery插件bxslider用法实例分析
Apr 16 Javascript
JavaScript编写简单的计算器
Nov 25 Javascript
JS框架之vue.js(深入三:组件1)
Sep 29 Javascript
node.js的事件机制
Feb 08 Javascript
Angular实现响应式表单
Aug 04 Javascript
解决vue build打包之后首页白屏的问题
Mar 06 Javascript
angular 实现同步验证器跨字段验证的方法
Apr 11 Javascript
Vue实现点击显示不同图片的效果
Aug 10 Javascript
vue在路由中验证token是否存在的简单实现
Nov 11 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
MYSQL环境变量设置方法
2007/01/15 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP实现简单的计算器
2020/08/28 PHP
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
初始Nodejs
2014/11/08 NodeJs
深入浅析同源策略和跨域访问
2015/11/26 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
python删除某个字符
2018/03/19 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
python numpy数组复制使用实例解析
2020/01/10 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
智能旅行箱:Horizn Studios
2018/04/30 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
党员群众路线承诺书
2014/05/20 职场文书
2014年国庆节寄语
2014/09/19 职场文书
离婚协议书怎么写
2015/01/26 职场文书
六一儿童节开幕词
2015/01/29 职场文书
班级班风口号大全
2015/12/25 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android