2014-01-03 2 views
1

У меня есть следующая ситуация и я просто хочу проверить, правильно ли я делаю это. У меня есть несколько устройств у моих клиентов (RS232). Теперь у меня есть подключенный к нему RS232-WIFI-ключ, поэтому данные из устройства отправляются на мой сервер (он выводит данные, например: {12,1,etc). На моем сервере у меня есть скрипт NodeJS работает, что открывает порт и считывает все данные поступают.nodejs tcp listener script

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(); после получения данных? Это влияет на производительность сети для меня или моих клиентов? Если вам, ребята, нужна дополнительная информация, дайте мне знать.

ответ

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 
}); 
.... 
+0

Ok спасибо! Устройство настроено на режим клиентского режима tcp, и я не знаю, отправит ли он конечный сигнал (как я могу проверить?) Я знаю, что отправляемое отправление данных начинается с «{» и заканчивается «CS» " В случае, если устройство не отправляет сигнал окончания, я не могу закончить его сам после получения данных? Просто продолжайте слушать и извлекать данные, если он действительно отправлен на мой сервер и очистить буфер? Это лучший способ избежать накладных расходов tcp? – MVUG

+0

вы можете записывать события «end», чтобы узнать, что соединение закрыто для каждого сообщения или нет. – damphat

+0

Да, я понял. Но я не должен явно закрывать соединение в своем событии с данными? – MVUG

Смежные вопросы