我有以下情况,只是想检查一下我是否做得对。我的客户有几台设备(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();
?这对我或我的客户是否会损害网络性能?
如果你们需要更多信息,请告诉我们。
答案 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
});
....