尝试将缓冲区发送到多个客户端时,套接字陷入无限循环

问题描述 投票:0回答:1

我正在使用 socket.io 设置多个客户端,然后当一个客户端想要将任何文件发送给在场的其他人时,他们可以发送它。但在我的共享文件函数中,代码陷入了无限循环。它不符合给定的条件。 我的 server.js 文件

const express = require("express");
const app = express();
const socketio = require("socket.io");

app.use(express.static(__dirname + '/public'));

const expressServer = app.listen(3000);
const io = socketio(expressServer)

io.on('connection',(socket)=>{
  socket.on('file-meta',function(data){
     io.emit('fs-meta',data.metadata);
  })
  socket.on('fs-start',function(data){
     io.emit('fs-meta',{});
  })
  socket.on('file-raw',function(data){
     io.emit('fs-share',data.buffer);
  })
})


我的 sender.html 文件

<div class="file-input">
 <label for="file-input">Select files for sharing</label>
 <input type="file" id="file-input">
</div>

<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudfare.com/ajax/libs/downloadjs/1.4.1/download.min.js"></script>
<script>
 const socket = io('http://localhost:3000');
 let fileShare = {};
 document.querySelector('#file-input).addEventListener("change",function(e){
 let file = e.target.files[0];
 if(!file){
  return;
 }
 let reader = new FileReader();
 reader.onload = function(e){
  let buffer = new Uint8Array(reader.result);
  shareFile({
   filename:file.name,
   total_buffer_size:buffer.length,
   buffer_size:524288
   },buffer);
 }
 reader.readAsArrayBuffer(file);
})

function shareFile(metadata,buffer){
 socket.emit("file-meta",{metadata:metadata});
 socket.on("fs-share",function(){
   let chunk = buffer.slice(0,metadata.buffer_size);
   buffer = buffer.slice(metadata.buffer_size,buffer.length);
   if(chunk.length !=0){
     socket.emit("file-raw",{buffer:chunk});
   }
 });
}

socket.on("fs-meta",function(metadata){
 fileShare.metadata = metadata;
 fileShare.transmitted = 0;
 fileShare.buffer = [];
 socket.emit("fs-start");
});

socket.on("fs-share",function(buffer){
 fileShare.buffer.push(buffer);
 fileShare.transmitted += buffer.byteLength;
 if(fileShare.transmitted == fileShare.metadata.total_buffer_size){
   download(new Blob(fileShare.buffer),fileShare.metadata.filename);
   fileShare={};
 }else {
   socket.emit("fs-start");
 }
});
</script>

我尝试检查缓冲区是否到达那里。如果我尝试打印缓冲区日志,我可以获得 uint8array,但是在块大小变为零之后,它不会停止,而是进入无限循环。

javascript node.js websocket socket.io share
1个回答
0
投票

通过添加 forEach 设置多个套接字 i 并将 socektid 和数据作为对象存储在服务器中并根据 socekts ids 发送

© www.soinside.com 2019 - 2024. All rights reserved.