我们可以像在Spark Streaming中一样使用NodeJS作为TCP流数据吗?

时间:2016-08-30 15:27:50

标签: node.js sockets apache-spark tcp streaming

我想创建一个Node JS TCP侦听器/客户端,它将持续读取/侦听将写入TCP服务器的数据。

使用案例:使用IOC,我将在TCP服务器上获取传感器相关数据,我想使用Node JS读取

是否可以创建一个足以满足上述用例的Node JS应用程序?如果没有,请建议如何以更好的方式完成它?如果可能的话请建议我怎么做。

标记spark,因为目前我们正在考虑使用spark streaming来连续读取TCP服务器,但由于数据不是那么庞大,我想是否有更好的方法来实现这一任务。

1 个答案:

答案 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;