2014-06-20 96 views
3

我對NodeJSWebsockets很新,但我正在嘗試使用它。node.js websocket在客戶端斷開連接時崩潰

我所做的是從串口讀取傳入數據,然後使用websocket將這些數據發送到網頁。 從這裏一切正常。

問題是,當一個客戶關閉了瀏覽器,那麼我的NodeJS的WebSocket服務器崩潰,出現以下錯誤:

[email protected]:~/app# node socketserver.js 
open serial communication 
Client disconnected. 

/root/node-v0.10.29/lib/node_modules/ws/lib/WebSocket.js:187 
    else throw new Error('not opened'); 
      ^
Error: not opened 
    at WebSocket.send (/root/node-v0.10.29/lib/node_modules/ws/lib/WebSocket.js:187:16) 
    at sendAll (/root/app/socketserver.js:30:16) 
    at SerialPort.<anonymous> (/root/app/socketserver.js:58:8) 
    at SerialPort.emit (events.js:95:17) 
    at Object.module.exports.raw [as parser] (/root/node-v0.10.29/bin/node_modules/serialport/parsers.js:8:13) 
    at Object.SerialPort.options.dataCallback (/root/node-v0.10.29/bin/node_modules/serialport/serialport.js:143:15) 
    at SerialPortFactory.SerialPort._emitData (/root/node-v0.10.29/bin/node_modules/serialport/serialport.js:312:20) 
    at afterRead (/root/node-v0.10.29/bin/node_modules/serialport/serialport.js:290:18) 
    at /root/node-v0.10.29/bin/node_modules/serialport/serialport.js:304:9 
    at Object.wrapper [as oncomplete] (fs.js:459:17) 

這裏是我的WebSocket /代碼的serialport:

var WebSocketServer = require('../node-v0.10.29/lib/node_modules/ws').Server; 
var SerialPort = require('../node-v0.10.29/bin/node_modules/serialport').SerialPort; 

var serialPort; 
var portName = '/dev/ttyACM0'; 
var sendData = ""; 
var wss = new WebSocketServer({port: 8080}); 

var CLIENTS=[]; 

wss.on('connection', function(ws) { 
     CLIENTS.push(ws); 
    ws.on('message', function(message) { 
     console.log('received: %s', message); 
     sendAll(message); 
    }); 
    ws.on('close', function() { 
     console.log('Client disconnected.'); 
    }); 
    ws.on('error', function() { 
     console.log('ERROR'); 
    }); 
    ws.send(""); 
}); 

function sendAll(message) 
{ 
for(var i=0;i<CLIENTS.length;i++) 
    { 
    CLIENTS[i].send(message); 
    } 
} 

serialListener(); 

function serialListener(debug) 
{ 
    var receivedData = ""; 
    serialPort = new SerialPort(portName, { 
     baudrate: 9600, 
     dataBits: 8, 
     parity: 'none', 
     stopBits: 1, 
     flowControl: false 
    }); 

    serialPort.on("open", function() { 
     console.log('open serial communication'); 
      // Listens to incoming data 
     serialPort.on('data', function(data) { 
      receivedData += data.toString(); 
      if (receivedData .indexOf('E') >= 0 && receivedData .indexOf('B') >= 0) { 
      sendData = receivedData .substring(receivedData .indexOf('B') + 1, receivedData .indexOf('E')); 
      receivedData = ''; 
     } 
     // send the incoming data to browser with websockets. 
     sendAll(sendData); 
     }); 
    }); 
} 

有人能幫我弄清楚這裏有什麼問題嗎?

回答

7

我想,你應該從CLIENTS陣列上刪除插座closeerror事件。否則,它會嘗試將消息發送到已關閉的套接字。

+0

看來你是正確的,因爲如果我的init回'close'事件我的數組不會再崩潰。但是,從現在開始,我正在尋找一種方法來識別斷開連接的客戶端以將其從陣列中移除 – user2196728

+1

也許'CLIENTS.splice(CLIENTS.indexOf(ws),1)'? – rkusa

+0

太棒了,作品!將進一步調查(我正在學習...)。謝謝 – user2196728

2

我有這個相同的問題。原來我試圖將事件發送到處於「關閉」狀態的套接字。檢查每個插座是廣播消息固定它,我之前專門開:

function sendAll(data){ 
     for(var i = 0; i < clients.length; i++){ 
      if(this.clients[i].readyState != this.clients[0].OPEN){ 
       console.error('Client state is ' + this.clients[i].readyState); 
      } 
      else{ 
       this.clients[i].send(data); 
      } 
     } 
    } 
+2

官方文檔測試readyState是這樣的:'if(this.clients [i] .readyState === WebSocket.OPEN)'我認爲這比測試第一個數組元素的屬性更可取 – NoChecksum

0

試試這個,同時將數據發送到客戶端: - 插座是我目前的網絡插座object.It覆蓋默認>的WebSocket。 js類拋出「未打開錯誤」的條件。

if (socket.readyState != socket.OPEN) { 
    console.error('Client state is ' + socket.readyState); 
    //or any message you want 
} else { 
    socket.send(JSON.stringify(object)); //send data to client 
} 
相關問題