2015-12-29 206 views
0

我有一個代碼跑了兩個小時,需要通過套接字發送結果。我已經完成了所有設置,並且第一次沒事。但是,第二次調用該函數時,它不再有效。爲了證明它,我迷上了我的功能區間:間隔發送文件套接字

var soc = require('socket.io-client'); 
var fs = require('fs'); 
var ss = require('socket.io-stream'); 

var jsonfile = require('jsonfile'); 
var calculationResultsFile = './publicdata/CalculationResults.json'; 

function sendFile(){ 
    var calculationResultsFile = './publicdata/CalculationResults.json'; 
    var socket = new soc('http://localhost:1234', { 
     'reconnection': false, 
     'reconnectionDelay': 1000, 
     'reconnectionDelayMax': 10000, 
     'reconnectionAttempts': 5 
    }); 
    socket.on('connect', function() { 
     console.log('Sockets connected'); 
     var stream = ss.createStream(); 
     ss(socket).emit('sendData', stream, {name: 'jsonHourly'}); 
     fs.createReadStream(calculationResultsFile).pipe(stream); 

     socket.on('completedstreamfile', function(){ 
      console.log('File send. Closed socket.'); 
      socket.close(); 
     }); 
    }); 
} 


setInterval(function(){ 
    console.log('Interval start'); 
    sendFile() 
}, 10000); 

一些輸出:

Interval start 
Sockets connected 
File send. Closed socket. 
Interval start 
Interval start 
Interval start 

我想這是因爲SENDFILE功能不正常關閉。但是,在socket.close()之後使用return也不會。

編輯:進一步澄清;我需要這個的原因是因爲服務器可能會脫機或其他。如果我只在腳本啓動時建立連接,則不一致。

+1

只是好奇你爲什麼每次關閉套接字?它部分地挫敗了websockets的目的。 –

+0

也想到了這一點,但即使我把它打開也是一樣的。第一次後不發送。 – SecondLemon

回答

0

我有它的工作。問題在於這會多次啓動套接字及其所有事件偵聽器。另外'forceNew'選項應該是真實的。

var soc = require('socket.io-client'); 
var fs = require('fs'); 
var ss = require('socket.io-stream'); 

var jsonfile = require('jsonfile'); 
var calculationResultsFile = './publicdata/CalculationResults.json'; 


var calculationResultsFile = './publicdata/CalculationResults.json'; 
var socket = new soc('http://localhost:1234', { 
    'reconnection': false, 
    'forceNew': true 
}); 
socket.on('connect', function() { 
    console.log('Sockets connected'); 
    var stream = ss.createStream(); 
    ss(socket).emit('sendData', stream, {name: 'jsonHourly'}); 
    fs.createReadStream(calculationResultsFile).pipe(stream); 
}); 
socket.on('completedstreamfile', function(){ 
    console.log('File send. Closed socket.'); 
    socket.disconnect(); 
}); 
socket.on('connect_error', function(err){ 
    console.log('Connection error: '+err); 
}); 
socket.on('connect_timeout', function(){ 
    console.log('Connection timeout') 
}); 

setInterval(function(){ 
    console.log('Interval start'); 
    socket.disconnect(); 
    socket.connect(); 
}, 40000); 

關閉接收服務器只是提供了一個錯誤,一旦你再次啓動它會工作。所以一切都很好。