我想创建一个Node JS TCP侦听器/客户端,它将持续读取/侦听将写入TCP服务器的数据。
使用案例:使用IOC,我将在TCP服务器上获取传感器相关数据,我想使用Node JS读取 。
是否可以创建一个足以满足上述用例的Node JS应用程序?如果没有,请建议如何以更好的方式完成它?如果可能的话请建议我怎么做。
标记spark,因为目前我们正在考虑使用spark streaming来连续读取TCP服务器,但由于数据不是那么庞大,我想是否有更好的方法来实现这一任务。
答案 0 :(得分:1)
使用原始套接字存在一些问题:必须同步发送数据到端口;手动检查插座是否已连接;按包划分原始数据。下面以|
作为包分隔符的简单客户端示例。
// Bad code; wait of improvements
'use strict'
const net = require('net');
const EventEmitter = require('events');
const util = require('util');
function Listener (opts) {
this.send = send;
let listener = this;
let queue = [];
let isBusy = true;
let socket;
connect(opts);
function send (data) {
queue.push(data);
if (isBusy)
return;
isBusy = true;
next();
}
function next() {
if (queue.length == 0)
return (isBusy = false);
if (socket) {
socket.write(data + '|', function (err) {
if (err)
return socket.emit('error', err);
queue.shift();
next();
});
}
}
function connect (opts) {
socket = net.connect({host: opts.host, port: opts.port});
queue = [];
isBusy = true;
socket.on('connect', () => {
isBusy = false;
listener.emit('connect');
});
let buffer = '';
socket.on('data', function(chunk) {
buffer += chunk;
let msgs = buffer.split('|');
buffer = msgs.pop();
msgs.forEach((msg) => listener.emit('message', msg));
});
socket.on('close', () => listener.emit('disconect'));
socket.on('error', (err) => listener.emit('error', err));
}
}
util.inherits(Listener, EventEmitter);
let listener = new Listener({host: '127.0.0.1', port: 111});
listener.on('connect', () => ...);
listener.on('disconnect', () => ...);
listener.on('error', (err) => ...);
listener.on('message', (msg) => ...);
listener.send('Hello world'); // between connect and disconnect;