MaxListenersExceededWarning с одним клиентом - PullRequest
0 голосов
/ 03 октября 2018

Я регистрирую устройство GPS с помощью node.js, и у меня странное поведение.

Мой код сервера очень прост

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 голосов
/ 03 октября 2018

Проблема в том, что я использовал socket.pipe(socket); для отправки данных обратно на устройство, но pipe не следует использовать в этом случае, поскольку он отправляет весь объект сокета, я предполагаю, что в каждом сообщении сокет вкладывал свой сокетсобственные значения, и это действительно была утечка памяти.

После удаления строкового кода pipe предупреждение пропало

Дополнительная информация о канале: Использование pipe () в узле.js нетто

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...