一个客户端的MaxListenersExceededWarning

时间:2018-10-02 21:06:24

标签: node.js sockets tcp

我正在使用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);

1 个答案:

答案 0 :(得分:0)

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

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

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