经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Node.js » 查看文章
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
来源:jb51  时间:2018/11/12 10:06:42  对本文有异议

最近使用了protobuf进行数据交互,发送在node.js接收前端的二进制数据出现了数据错误等问题。后来发现思路上面的问题,在req.on('data',()=>{})事件中的处理不适当才引发数据错乱。借此发

我先直接贴正确接收二进制数据代码

  1. const server = http.createServer((req, res) => {
  2. if(req.method==='OPTIONS'){
  3. res.setHeader("Access-Control-Allow-Origin", "*");
  4. res.statusCode=200;
  5. }
  6. if(req.method==='POST'){
  7. // 存储数组空间
  8. let msg=[];
  9. // 接收到数据消息
  10. req.on('data',(chunk)=>{
  11. if(chunk){
  12. msg.push(chunk);
  13. }
  14. })
  15. // 接收完毕
  16. req.on('end',()=>{
  17. // 对buffer数组阵列列表进行buffer合并返回一个Buffer
  18. let buf=Buffer.concat(msg);
  19. conosole.log(buf)//提取Buffer正确
  20. })
  21. }
  22. });
  23. server.listen(3000,'127.0.0.1');

在nodejs中接收buffer数据需要以数组阵列的方式存储然后通过buffer.concat对数组阵列合并创建新的arraybuffer。这样就正确的接收二进制数据了。

示例二:

以后端传送threejs中的点阵数组为例:

后端:

  1. let buffer = Buffer.alloc((points.length + 4) * 4)
  2.  
  3. //points.length + 4:预留前四个数字为其他信息(比如两个数字为一组,或者三个数字为一组)
  4. //预留位置
  5. buffer.writeFloatLE(1, 0)
  6. buffer.writeFloatLE(2, 4)
  7. buffer.writeFloatLE(3, 8)
  8. buffer.writeFloatLE(4, 12)
  9.  
  10. //buffer前四个数为信息
  11. //point数据从第16位开始写入
  12. for (let i = 0, len = points.length; i < len; i++) {
  13.   buffer.writeFloatLE(points[i], i * 4 + 16)
  14. }
  15. res.send(buffer)
  16.  

前端:

  1. let pointXhr = new XMLHttpRequest()
  2. pointXhr.onreadystatechange = function () {
  3.   var DONE = pointXhr.DONE || 4;
  4.   if (pointXhr.readyState === DONE) {
  5.     let buffer = pointXhr.response
  6.     let bufferArray = new Float32Array(buffer);
  7.     for (var i = 0; i < buffer.length; ++i) {
  8.       bufferArray[i] = buffer[i];
  9.     }
  10.     let pointsArray = bufferArray.slice(4)
  11.     let points = []
  12.     //pointsArray 点阵从第5个开始(前四个数为其他信息)
  13.     for (let i = 0, l = pointsArray.length / 3; i < l; i++) {
  14.       points.push({
  15.         x: pointsArray[i * 3],
  16.         y: pointsArray[i * 3 + 1],
  17.         z: pointsArray[i * 3 + 2]
  18.       })
  19.     }
  20.     callback(points)
  21.   }
  22. }
  23. pointXhr.open("POST",url,true);
  24. pointXhr.responseType = 'arraybuffer';
  25. pointXhr.send(null);

前端接收图片buffer

  1. let imageXhr = new XMLHttpRequest()
  2. imageXhr.onreadystatechange = function () {
  3.   var DONE = imageXhr.DONE || 4;
  4.   if (imageXhr.readyState === DONE) {
  5.     if (imageXhr.response) {
  6.       let bufferArray = imageXhr.response
  7.       let uint8Array = new Uint8Array(bufferArray);
  8.       for (var i = 0; i < bufferArray.length; ++i) {
  9.       uint8Array[i] = bufferArray[i];
  10.     }
  11.     callback(uint8Array)
  12.     }
  13.   }
  14. }
  15. imageXhr.open("POST",url,true);
  16. imageXhr.responseType = 'arraybuffer';
  17. imageXhr.send(null);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号