2016-08-30 53 views
0

我想創建一個節點JS TCP偵聽器/客戶端,它將持續保持讀取/偵聽將寫入TCP服務器的數據。我們是否可以使用NodeJS來處理TCP流數據,就像我們在Spark Streaming中支持的一樣?

使用案例:使用國際奧委會,我將獲得TCP服務器上的傳感器相關的數據,這些數據我想用JS節點讀取不斷

是否有可能創建一個Node JS應用程序,這將足以我的上述用例?如果沒有,請建議如何以更好的方式完成它?如果可能的話,請告訴我該怎麼做。

標記火花,因爲目前我們正在考慮使用火花流技術以連續的方式讀取TCP服務器,但由於數據並不那麼龐大,我正在考慮是否有更好的方法來完成這項任務。

+0

你看過[Socketio](http://socket.io/)嗎?這可能是需要考慮的事情。 – ishmaelMakitla

+0

yaa我正在檢查,但會不斷聽TCP服務器? – Vishrant

+0

但是你有沒有嘗試過 - 你可以保持套接字連接打開並讀取數據,比如'conn.on('some-event',function(some-data-object){})' - 但問題是你的問題最多可能會徵求意見,這就是爲什麼應該避免這些。選擇一種可能的解決方案,嘗試一下,當你遇到錯誤時,在這裏發佈具體問題。 – ishmaelMakitla

回答

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; 
相關問題