2015-07-13 40 views
0

我試圖從流服務器通過套接字圖像客戶端的額外的大小,如果沒有發生斷開重新連接工作正常,但如果我沒有斷開代碼重新連接我意識到大小的增加。上的NodeJS插座斷開二進制流產生的數據

這裏是代碼樣品

服務器側

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)); 
    } 

爲什麼可變大小增加時斷開重新連接發生哪些給出錯誤的進度跟蹤

回答

0

問題是,當斷開/重新連接發生時,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});