Net.Socket实例不会在NodeJS中消失

时间:2016-08-18 23:05:40

标签: javascript node.js sockets tcp

我正在尝试使用Node重新创建硬件串行服务器的功能,但它实际上正在运行,但我从已关闭的套接字实例中收到错误。

以下是该应用的简化版本,以显示我正在做的事情......

var net = require('net');
var SerialPort = require('serialport');
var connectionCounter = 0;
var port = new SerialPort('/dev/ttyUSB0', function () {
    var server = net.createServer();
    server.on('connection',function(socket) {
      connectionCounter++;
      var connNumber = connectionCounter;
      socket.on('error', function () {
        console.log('socket ' + connNumber + ' errored');
      });
      socket.on('data', function(data) {
        port.write(data);
      });
      port.on('data', function(data) {
        socket.write(data);
      });
    });
    server.listen(8887, '127.0.0.1');
  }
});

因此,发送到8887端口的第一个代码块工作正常,并通过套接字返回数据。错误从第二个块开始。在示例中,我将保留套接字实例的计数并输出带有错误的套接字实例编号。因此,当程序运行时,套接字实例的数量不断增加。最新的实例最终将处理数据,但我无法弄清楚我需要删除什么来清理所有以前的套接字实例,因此他们将停止尝试处理传入的数据。

我已经尝试过socket.end()和socket.destroy(),但这些似乎不起作用。我是否需要删除服务器本身并重新创建它?

2 个答案:

答案 0 :(得分:1)

如果有人发现这个并且关心出了什么问题,那么每次创建新的网络套接字时,我都会在serialport对象上设置一个事件监听器。因此,即使我每次关闭时都删除套接字,串口侦听器也会尝试将数据发送到所有旧的已删除套接字。所以解决方案是在关闭网络套接字时从serialport对象中删除Listeners。

答案 1 :(得分:0)

您可以使用数组存储套接字以后可以删除。这是示例代码,希望您有这个想法

var net = require('net');
var SerialPort = require('serialport');
var connectionCounter = 0;
var mySockets = [];
var port = new SerialPort('/dev/ttyUSB0', function () {
    var server = net.createServer();
    server.on('connection',function(socket) {
    mySockets.push(socket);
      connectionCounter++;
      var connNumber = connectionCounter;
      socket.on('error', function () {
        console.log('socket ' + connNumber + ' errored');
      });
      socket.on('data', function(data) {
        port.write(data);
      });
      port.on('data', function(data) {
        socket.write(data);
      });
    });
    server.listen(8887, '127.0.0.1');
  }
//get the sockets you want to delete
var s = mySockets.pop();
s = null;
});