我正在使用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);
答案 0 :(得分:0)
问题是我正在使用socket.pipe(socket);
将数据发送回设备,但是在这种情况下不应该使用pipe
,因为它发送了所有套接字对象,我假设在每条消息中套接字正在嵌套自己的值,这确实是内存泄漏。
删除pipe
行代码后,警告消失了
有关管道的更多信息:Using pipe() in Node.js net