套接字断开连接时的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});