【问题标题】:MaxListenersExceededWarning with one clientMaxListenersExceededWarning 与一个客户端
【发布时间】:2018-10-03 05:54:59
【问题描述】:

我正在使用 node.js 记录 GPS 设备,但我的行为很奇怪。

我的服务器代码很简单

var net = require('net');

var server = net.createServer(function(socket) {
    var imei;

    console.log("Socket: " + socket.remoteAddress + ":" + socket.remotePort);

    socket.on("data", function(data){
        var txt = data.toString("utf-8");

        console.log(txt);

        if(!imei){
            imei = parseInt(txt.split("imei:")[1]);
        }

        // login device
        if(txt.startsWith("##") && txt.endsWith(",A;")){
            socket.write('LOAD');
        // heartbeat
        }else if(parseInt(txt) == imei){
            socket.write(`ON`);
        }
        socket.pipe(socket);
    });
    socket.on("end", function () {
        console.log("out!")
    });
});

server.listen(8888);

登录GPS设备后,每隔一分钟发送一次心跳,我只使用一台设备,所以只有一个客户端。

服务器输出如下所示:

Socket: ::ffff:191.000.000.000:9292 // new client
##,imei:000000000000000,A; // login
000000000000000; // heartbeat 
000000000000000;
000000000000000;
000000000000000;
000000000000000;
000000000000000;
000000000000000;
000000000000000;
(node:12684) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit

如您所见,在一些消息之后它显示MaxListenersExceededWarning,但我很困惑,如果只有一个客户端连接,为什么我会看到此消息? 代码有问题吗? 我该如何解决这个问题?

编辑:

添加--trace-warnings 标志后

我看到了这个输出:

(node:8592) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit
    at _addListener (events.js:280:19)
    at Socket.addListener (events.js:297:10)
    at Socket.Readable.on (_stream_readable.js:772:35)
    at Socket.once (events.js:341:8)
    at Socket.Readable.pipe (_stream_readable.js:580:9)
    at Socket.<anonymous> (server.js:30:16)
    at emitOne (events.js:121:20)
    at Socket.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)

服务器代码第30行为:socket.pipe(socket);

【问题讨论】:

  • 可以在运行时添加输出node --trace-warnings [nameOfYourFile].js
  • 添加 --trace-warnings 显示相同的输出:(node:7120) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit
  • 好的,我在最后添加了--trace-warnings,这就是它不起作用的原因。我已经用新信息编辑了帖子
  • 我会在服务器代码中尝试require('events').EventEmitter.prototype._maxListeners = 15; 之类的东西
  • 我解决了它从代码中删除pipe。感谢您的宝贵时间!

标签: node.js sockets tcp


【解决方案1】:

问题是我使用socket.pipe(socket); 将数据发送回设备,但在这种情况下不应使用pipe,因为它发送所有套接字对象,我假设在每条消息中套接字都嵌套了它的自己的值,这确实是内存泄漏。

删除pipe行代码后,警告消失了

关于管道的更多信息:Using pipe() in Node.js net

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 2011-05-15
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多