详解如何在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学习笔记之jQuery选择器的使用
Dec 22 Javascript
jQuery下的动画处理总结
Oct 10 Javascript
JS执行删除前的判断代码
Feb 18 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
May 12 Javascript
javascript 控制input只允许输入的各种指定内容
Jun 19 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
Jul 27 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
使用JavaScript实现旋转的彩圈特效
Jun 23 Javascript
原生js实现Flappy Bird小游戏
Dec 24 Javascript
vue 中固定导航栏的实例代码
Nov 01 Javascript
js实现弹窗效果
Aug 09 Javascript
js实现页面导航层级指示效果
Aug 25 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文件下载类
2006/12/06 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
Jquery 弹出层插件实现代码
2009/10/24 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
Python中操作符重载用法分析
2016/04/29 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
写给女生的道歉信
2014/01/14 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
三国演义读书笔记
2015/06/25 职场文书
诚实守信主题班会
2015/08/13 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书