2014-06-20 94 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 
} 
相关问题