Socket.io发出进度检查
Socket.io emit progress check
我使用Socket.io上传文件。它适用于以下模式:
- 客户端:从输入读取文件并将其编码到Base64并压缩
- 客户端:发出Socket.io事件"上传",包括压缩文件作为一段数据
- 服务器:监听"上传"事件,解压解码文件并保存
这个问题发生在大文件中:我看不到通过客户端发送的数据的进度(就像我对XHR所做的那样)。
为了解决这些问题,我必须跟踪(检查)发射事件的上传进度。我该怎么做?
我只想在客户端上收听上传进度
多亏了bnuhero,socketio文件上传可以在服务器端监听进度,并在每上传5%或20%时向客户端发送消息。因此,这意味着每个文件分别发送20或5条消息。我想听听客户方面的进展。
看起来不可能用裸Socket.io在客户端检查进度。io流解决了这个问题。
客户端:
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');
}
});
});
如果这仍然不起作用,您可以在服务器和客户端之间添加一个协商服务器对"接收到的"事件作出响应,客户端在接收到"接收到"事件时发送下一个块
允许您的服务器限制客户端的速度,但是这应该通过您使用的套接字库来工作
编辑:
包括反馈和消息订单
第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);
流具有退避机制,服务器接受流缓冲区的每个块如果服务器放慢速度,则以较低的速率读取流,从而获得更多的进度。
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 如何检查管道中未定义的项目
- 主干-不管怎样,检查事件以前是否绑定过
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 使用javascript检查多个输入值,并在1次检查中标记多个输入框
- 递归使用 eval() 是检查程序执行的好方法吗?
- 检查onsubmit doenst work jquery contactform上的函数
- Socket.io发出进度检查
- 如何使用socket IO检查有多少参与者连接到我的聊天室
- Socket.io检查是否有连接
- 检查用户是否刷新,返回,关闭浏览器等 socket.io
- socket.io - 检查客户是否在特定房间
- 如何检查是否提前.IO在我的angularjs网站上工作正常
- node . js,套接字.Io:检查用户是否在线或离线
- 检查Socket.IO中特定房间中存储的客户端数据
- 套接字.Io:检查指定socket id的连接状态
- 检查在哪个房间是一个指定的客户端套接字io