套接字断开连接时的nodejs二进制流产生额外大小的数据
nodejs binary streaming on socket disconnection produce extra size of data
我正在尝试通过套接字将图像从服务器流式传输到客户端,如果没有断开连接重新连接,它工作正常但是如果我确实在代码中断开连接重新连接,我意识到尺寸增加了。
这里是代码示例
服务器端
socket.on('get file', function () {
path = '../../../default/files/20141120_191129_0.jpg';
fs.stat(path, function (err, stat) {
if (err) {
console.log(err);
}
stream = fs.createReadStream(path,
{encoding: 'binary'});
stream.on('data', function (data) {
socket.emit('file', {"data": data, "size" : stat.size})
});
console.log(stat.size);
});
});
客户端
那段代码工作正常,日志显示不到 100%(上传进度)
console.log 结果 95.1968693802965 %
chat (line 201)
2065278
chat (line 208)
1966080
chat (line 209)
98.37009835963973 %
chat (line 201)
2065278
chat (line 208)
2031616
chat (line 209)
2065278
socket.on('connect', function () {
setTimeout(function () {
socket.emit('get file');
}, 1000);
});
var base64string = '';
var i =0;
socket.on('file', function (data) {i++;
console.log((base64string.length / data.size) * 100+" %");
base64string += data.data;
if(data.size == base64string.length){
buildimage(base64string);
}
})
function buildimage(base64str) {
console.log(base64str.length);
$("#img").attr("src", 'data:image/png;base64,' + btoa(base64str));
}
但是如果我把客户端改成断开重连就失败了,二进制数据比原图大
console.log 结果 142.79530407044476 %
chat (line 201)
2065278
chat (line 208)
2949120
chat (line 209)
145.96853304978796 %
chat (line 201)
2065278
chat (line 208)
3014656
socket.on('connect', function () {
$('#chat').addClass('connected');
setTimeout(function () {
socket.emit('get file');
}, 1000);
});
var base64string = '';
var i =0;
socket.on('file', function (data) {i++;
console.log((base64string.length / data.size) * 100+" %");
if (i == 15) {
socket.disconnect();
console.log('disconnected');
socket.connect();
}
console.log(data.size);
console.log(base64string.length);
base64string += data.data;
if(data.size == base64string.length){
buildimage(base64string);
}
})
function buildimage(base64str) {
console.log(base64str.length);
$("#img").attr("src", 'data:image/png;base64,' + btoa(base64str));
}
为什么当断开连接重新连接发生时变量大小增加,导致错误的进度跟踪
问题是当disconnect/reconnect发生时,createreadstream从头开始读取文件,所以我们必须根据客户端存储文件的变量长度来设置起始值
需要简单的更改才能使其正常工作
客户端
setTimeout(function () {
// send the variable length as starting reading point
socket.emit('get file', {start: base64string.length});
}, 1000);
服务器端
socket.on('get file', function (options) {
path = '../../../default/files/20141120_191129_0.jpg';
fs.stat(path, function (err, stat) {
if (err) {
console.log(err);
}
//take the starting reading point to start reading from
stream = fs.createReadStream(path, {encoding: 'binary', start: options.start});
我正在尝试通过套接字将图像从服务器流式传输到客户端,如果没有断开连接重新连接,它工作正常但是如果我确实在代码中断开连接重新连接,我意识到尺寸增加了。
这里是代码示例
服务器端
socket.on('get file', function () {
path = '../../../default/files/20141120_191129_0.jpg';
fs.stat(path, function (err, stat) {
if (err) {
console.log(err);
}
stream = fs.createReadStream(path,
{encoding: 'binary'});
stream.on('data', function (data) {
socket.emit('file', {"data": data, "size" : stat.size})
});
console.log(stat.size);
});
});
客户端 那段代码工作正常,日志显示不到 100%(上传进度)
console.log 结果 95.1968693802965 %
chat (line 201)
2065278
chat (line 208)
1966080
chat (line 209)
98.37009835963973 %
chat (line 201)
2065278
chat (line 208)
2031616
chat (line 209)
2065278
socket.on('connect', function () {
setTimeout(function () {
socket.emit('get file');
}, 1000);
});
var base64string = '';
var i =0;
socket.on('file', function (data) {i++;
console.log((base64string.length / data.size) * 100+" %");
base64string += data.data;
if(data.size == base64string.length){
buildimage(base64string);
}
})
function buildimage(base64str) {
console.log(base64str.length);
$("#img").attr("src", 'data:image/png;base64,' + btoa(base64str));
}
但是如果我把客户端改成断开重连就失败了,二进制数据比原图大
console.log 结果 142.79530407044476 %
chat (line 201)
2065278
chat (line 208)
2949120
chat (line 209)
145.96853304978796 %
chat (line 201)
2065278
chat (line 208)
3014656
socket.on('connect', function () {
$('#chat').addClass('connected');
setTimeout(function () {
socket.emit('get file');
}, 1000);
});
var base64string = '';
var i =0;
socket.on('file', function (data) {i++;
console.log((base64string.length / data.size) * 100+" %");
if (i == 15) {
socket.disconnect();
console.log('disconnected');
socket.connect();
}
console.log(data.size);
console.log(base64string.length);
base64string += data.data;
if(data.size == base64string.length){
buildimage(base64string);
}
})
function buildimage(base64str) {
console.log(base64str.length);
$("#img").attr("src", 'data:image/png;base64,' + btoa(base64str));
}
为什么当断开连接重新连接发生时变量大小增加,导致错误的进度跟踪
问题是当disconnect/reconnect发生时,createreadstream从头开始读取文件,所以我们必须根据客户端存储文件的变量长度来设置起始值
需要简单的更改才能使其正常工作
客户端
setTimeout(function () {
// send the variable length as starting reading point
socket.emit('get file', {start: base64string.length});
}, 1000);
服务器端
socket.on('get file', function (options) {
path = '../../../default/files/20141120_191129_0.jpg';
fs.stat(path, function (err, stat) {
if (err) {
console.log(err);
}
//take the starting reading point to start reading from
stream = fs.createReadStream(path, {encoding: 'binary', start: options.start});