nodejs tcp监听器脚本

时间:2014-01-03 19:15:40

标签: node.js tcp

我有以下情况,只是想检查一下我是否做得对。我的客户有几台设备(RS232)。现在我有一个与它连接的RS232-WIFI加密狗,因此设备外的数据被发送到我的服务器(它输出一个数据串,例如:{12,1,etc)。在我的服务器上,我运行了一个NodeJS脚本,它打开一个端口并获取所有数据。

var net = require('net');
var host = '1.1.1.1';
var servers = [];
var ports = [20000, 20001, 20002, 20003, 20004];

// Create servers
ports.forEach(function (port) {

var s = net.createServer(function (sock) {
    // We have a connection - a socket object is assigned to the connection automatically
    console.log('CONNECTED (' + sock.localPort + '): ' + sock.remoteAddress + ':' + sock.remotePort);

    // Add a 'data' event handler to this instance of socket
    sock.on('data', function (data) {
        // post data to a server so it can be saved and stuff
        postData(data.toString(), sock);

        // close connection
        sock.end();
    });

    sock.on('error', function (error) {
        console.log('******* ERROR ' + error + ' *******');

        // close connection
        sock.end();
    });
});

s.listen(port, host, function () {
    console.log('Server listening on ' + host + ':' + s.address().port);
});

servers.push(s);
});

好的,所以这很好用。但我想知道,有时不是所有的数据都是一次性发布的,有时我会得到{12,,一秒钟之后我会得到其余的数据(或者需要更多时间)。如何进一步优化此脚本?收到数据后是否需要致电sock.end();?这对我或我的客户是否会损害网络性能? 如果你们需要更多信息,请告诉我们。

1 个答案:

答案 0 :(得分:0)

这取决于你的设备的协议,如果设备使用每个连接来获取一大块数据,你可以像这样编写程序:(不要在数据事件上关闭套接字)

....
// socket will close and destroy automatically after the device close the connection
var s = net.createServer(function (sock) {
    sock.setEncoding('utf8');

    var body = "";
    sock.on('data', function (data) {
        body = body + data;
    });

    sock.on('end', function() {
        console.log(data);
        postData(data);
    });

    // TODO error handling here
});
....

注意:不保证Socket会立即为您提供所有数据,您应该先监听数据事件,然后在使用之前连接所有块。

如果你的设备没有关闭套接字,你将不会收到on('end'),那么代码应该是这样的:

....
var s = net.createServer(function (sock) {
    sock.setEncoding('utf8');

    // var body = "";
    sock.on('data', function (data) {
        // body = body + data;
        postData(data);
    });

    sock.on('end', function() {
        console.log('end');
    });

    // TODO error handling here
});
....