client:
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()]);
});
server:
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');
}
});
});
如果这仍然不起作用,您可以在服务器和客户端之间添加协商
服务器响应“已收到”事件,客户端在收到“已收到”事件后发送下一个块
允许您的服务器限制客户端的速度,但这应该已经通过您使用的套接字库起作用
EDIT:
包括反馈和消息顺序
EDIT2:
我想我误解了你的问题
但要解决我现在理解的问题,例如,指示何时刷新缓冲区的每个部分,有两个选项,要么让它仍然模拟该行为,要么接受服务器接受的块并将其用作每个部分的尺寸。
后者是实际进度,所以我举一个例子(如果服务器接受 1Mb 的块并且文件是 1Mb,它仍然会一步从 0 到 100。
https://github.com/nkzawa/socket.io-stream 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);
流有一个退避机制,服务器接受流缓冲区的每个块
如果服务器速度减慢,则流的读取速度会降低,从而给您更多的进度激励