2011-07-16 3 views
1

私はシンプルなサーバーを持っています。コマンドを送信すると、\ r \ nで区切られた応答で返信されます。Node.js TCPクライアントコマンド/レスポンス

私はクライアント上でコマンド(コールバック)メソッドを取得しようとしました。この簡略化されたコードスニペットをチェックアウト:

var net = require('net'); 

var Client = function() { 
    this.data = ""; 
    this.stream = net.createConnection(port, host); 

    this.stream.on('data', function(data) { 
     var self = this; 

     this.data += data; 
     self.process()    
    }; 

    this.process = function() { 
     var _terminator = /^([^\r\n]*\r\n)/; 

     while(results = _terminator.exec(this.data)) { 
      var line = results[1]; 
      this.data = this.data.slice(line.length); 

      this.emit('response', data); 
     }; 
    }; 

    this.sendCommand = function(command, callback) { 
     var self = this; 

     var handler = function(data) { 
      self.removeListener('response', handler); 

      callback && callback(data); 
     } 

     this.addListener('response', handler); 

     this.stream.write(command); 
    }; 

    this.command_1 = function(callback) { 
     this.sendCommand('test', callback); 
    }; 

    this.command_2 = function(callback) { 
     this.sendCommand('test2', callback); 
    }; 
} 

だから私はclient.command_1(関数(){})を実行し、その後client.command_2(関数(){})が、私のcommand_2 Iのコールバックでいますcommand_1からの応答を得ています。

このようなことを実装するのは正しい方法ですか?

+1

あなたが構築するために正確に何をしようとしています!たくさんの素敵なノードモジュールがあります。あなたはsocket.ioのようなsthを見ましたか?チャットなどのリアルタイムのことをするのに最適なモジュールです。 – pkyeck

+0

私は気付いていますが、このようなことを構築することに慣れています。 Socket.ioが私の頭に浮かんだ最初のものでした:) – mobius

+0

socket.ioは、* browser *とサーバーの間の双方向通信に同じapiを持つことについてのすべてです。ブラウザの違いや、さまざまなブラウザに異なる転送を隠すためのラッパーです。 –

答えて

0

あなたは

client.command_1(function() { 1; }); 
client.command_2(function() { 2; }); 

を実行するとき、あなたは「結果」リスナーとして両方コールバックを追加し、emit('result')が初めて発生したときに、両方のコールバックは(その後、最初のコールバックは、リストから自分自身を削除します)と呼ばれています。クライアント上ではなく、ある種の要求オブジェクトに対してコールバックを設定する必要があります。あなたのクライアントに何が起こるかに

シンプルコード:

var e = new EventEmitter(); 
e.on('result', function() { console.log(1); }); 
e.on('result', function() { console.log(2); }); 
// ... 
e.emit('result'); // here we trigger both callbacks which result in printing "1\n2\n" 
+0

私はそれが本当のケースであると確信していました。そして、私はいくつかの助けが必要でした。(あなたはそれに名前をつけていますが、メッセージキューはWebSockets、http、rpc、xmlrpcです。私のループから私を取り除く。ありがとう:) – mobius

関連する問題