Socket.io发出进度检查

我使用Socket.io来上传文件。 它适用于以下模式:

  1. 客户端:从input中读取文件并将其编码为Base64并压缩
  2. 客户端:发送包含压缩文件的Socket.io事件“上传”作为一个数据
  3. 服务器:收听“上传”事件,解压并解码文件并保存

大文件出现问题: 我看不到通过客户端发出的数据进度 (就像我用XHR做的那样)。

为了解决这些问题,我必须跟踪(检查)发射事件的上传进度。 我怎样才能做到这一点?


我想倾听客户端上的进度上传


多亏了bnuhero,socketio-file-upload可以在服务器端收听进度,并在每隔5%或20%的时间发送消息给客户端。 所以它意味着每个文件分别发送20或5条消息。 我想听取客户端的进展。


看起来像是没有可能检查客户端上的裸体Socket.io的进展。 Io-stream解决了这个问题。

客户:

var chunk_size = 100; var compressed_data = 'some-long-string'; var reg = new RegExp('/.{1,'+chunk_size+'}/g'); var parts = compressed_data .match(reg); var l = parts.length -1; client.socket.emit('data', parts.pop()); client.socket.on('received', function () { client.socket.emit('data', [l - parts.lengt, parts.pop()]); }); 

服务器:

 sockets.on('connection', function (socket) { var parts = []; socket.on('data', function (data) { if (data[1] === undefined) { fs.writeFile(parts.join(''), callback...); } else { parts[data[0]] = data[1]; socket.emit('received'); } }); }); 

如果这仍然不起作用,您可以在服务器和客户端之间添加一个协商,服务器响应“收到”事件,客户端在接收到“收到”事件时发送下一个块

这可以让你的服务器扼杀客户端的速度,但是这应该已经通过你使用的套接字库工作了

编辑:

包括反馈和消息顺序

EDIT2:

我想我误解了你的问题

但为了解决这个问题,我现在明白了,例如有一个缓冲区刷新每个部分刷新的指示有2个选项,要么仍然模拟该行为,要么接受服务器接受的块,并将其用作每个部分的大小。

后者是实际的进展,所以我给出了一个例子(如果服务器接受1Mb块,文件是1Mb,它仍然会从0到100一步到位。

https://github.com/nkzawa/socket.io-stream

服务器的例子就是那个github页面上显示的内容

客户端:

 var io = require('socket.io-client'); var ss = require('socket.io-stream'); var socket = io.connect('http://example.com/user'); var stream = ss.createStream(); var filename = 'profile.jpg'; var through = require('through'); var compressed_data = 'some-long-string'; var l = compressed_data .length; var total_progress = 0; //pass the stream trough throug, giving feedback for each chunk passed var tr = through(function (chunk) { total_progress += chunk.toString().length; client.socket.emit('progress', l, total_progress); this.queue(chunk) }, function () { client.socket.emit('progress', l, l); }) //use the streaming version of socket.io ss(socket).emit('profile-image', stream, {name: filename}); //get a stream for the compressed_data //filter it trough tr for the progress indication //and pass it to the socket stream fs.createReadStream(compressed_data ).pipe(tr).pipe(stream); 

stream有一个退避机制,服务器接受stream缓冲区的每个块,如果服务器减慢stream的读取速度较低,给你更多的进展

我不知道为什么,但socket.iostream是100倍的slover,然后使用socket.io发送