我正在使用 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,但是在块大小变为零之后,它不会停止,而是进入无限循环。
通过添加 forEach 设置多个套接字 i 并将 socektid 和数据作为对象存储在服务器中并根据 socekts ids 发送