客户端断开连接时 node.js websocket 崩溃 [英] node.js websocket crashes when client disconnect

查看:58
本文介绍了客户端断开连接时 node.js websocket 崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 NodeJSWebsockets 很陌生,但我正在尝试使用它.

I am very new to NodeJS and Websockets, but i am trying to play with it.

我所做的是从串行端口读取传入数据,然后使用 websocket 将这些数据发送到网页.从这里一切正常.

What i do is read incoming datas from Serial port, then send these datas to a web page using websocket. From here everything works fine.

  • 我使用 node-static 来提供我的网页
  • 我将 ws 用于 websocket
  • I use node-static to serve my web page
  • I use ws for websocket

问题是当客户端关闭浏览器时,我的 NodeJS websocket 服务器崩溃并出现以下错误:

The problem is when a client close his browser, then my NodeJS websocket server crashes with the following error :

root@WS-SERVER-2:~/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 代码:

Here is my websocket/serialport code :

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

有人能帮我弄清楚这里出了什么问题吗?

Can someone help me to figure out what's wrong here ?

推荐答案

我认为,您应该从 closeCLIENTS 数组中删除套接字错误 事件.否则,它会尝试向关闭的套接字发送消息.

I think, you should remove the socket from your CLIENTS array on both close and error event. Otherwise it tries to send a message to a socket that is closed.

这篇关于客户端断开连接时 node.js websocket 崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆