nodejs Websocket服务器 - 检测到可能的EventEmitter内存泄漏

Posted

技术标签:

【中文标题】nodejs Websocket服务器 - 检测到可能的EventEmitter内存泄漏【英文标题】:nodejs Websocket Server - possible EventEmitter memory leak detected 【发布时间】:2016-06-26 16:49:26 【问题描述】:

我对节点比较陌生,我正在努力寻找答案!

我创建了一个非常基本的节点脚本,用于连接到 rs232 串行设备,同时它用作 websocket 服务器,以便客户端可以连接到它以从 rs232 设备获取实时输出,但我在 11 个客户端连接后,不断收到事件发射器最大侦听器错误。

如果有人可以在这里帮助我,或者如果我以错误的方式处理代码,请提供一些建议。

谢谢 杰米

这是代码

var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
var WebSocketServer = require("ws").Server;

var serialPort = new SerialPort("COM5", 
  baudrate: 9600,
  parser: serialport.parsers.readline("\n")
);

var wss = new WebSocketServer( port: 3000 );

serialPort.on("open", function () 

  console.log('open');

    var weight = 0;

    wss.on("connection", function(ws) 

        serialPort.on('data', function(data) 

            weight = data.toString();

            wss.clients.forEach(function(wssclient) 
                wssclient.send(weight);
            );

        );

    );

);

【问题讨论】:

你的大部分代码总是加倍空格吗? 【参考方案1】:

如果您的连接处理程序,您添加一个新的事件处理程序serialPort.on('data', ...)。因此,对于每个新传入的 websocket 连接,您为serialPort 添加一个新的事件处理程序。而且,您也永远不会删除它们。所以,它们只是永远积累,它们也都做同样的事情。

您看到的警告是因为 eventEmitter 对象看到所有事件处理程序都针对同一条消息的累积,并怀疑可能有问题。

相反,您可以将其移出连接处理程序,并在一个事件处理程序中完成所有处理:

serialPort.on('data', function(data) 
    var weight = data.toString();
    wss.clients.forEach(function(wssclient) 
        wssclient.send(weight);
    );
);

serialPort.on("open", function () 
    console.log('open');
    wss.on("connection", function(ws) 
        // code here that needs to happen upon connection
    );
);

【讨论】:

以上是关于nodejs Websocket服务器 - 检测到可能的EventEmitter内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

nodejs socket 怎么检测客户端主动断开连接

php websocket转发到nodejs

nodejs没有将websocket发送到浏览器

NodeJS 安全 Websocket 不会附加到 https

nodejs-websocket介绍

如何用websocket+nodejs实现web即时通信服务端