2011-07-16 6 views
1

J'ai un serveur simple, vous lui envoyez une commande, il répond en retour avec une réponse délimitée par \ r \ n. J'ai donc essayé d'obtenir une méthode de commande (callback) sur mon client. Consultez cet extrait de code simplifié:Node.js TCP Commande/réponse du client

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); 
    }; 
} 

Je suis en train de faire une client.command_1 donc (function() {}), puis une client.command_2 (function() {}), mais dans le rappel de mon command_2 I Je reçois la réponse de command_1.

Est-ce la bonne façon de mettre en œuvre une telle chose?

+1

ce que vous essayez de construire exactement ?! il y a tellement de modules de nœuds que vous pourriez utiliser ... avez-vous regardé sth comme socket.io? C'est un excellent module pour faire des choses en temps réel comme le chat etc ... – pkyeck

+0

Je suis conscient, mais j'essaie de me familiariser avec la construction de choses comme ça. Socket.io a été la première chose qui me vient à l'esprit :) – mobius

+0

socket.io est tout à propos d'avoir même API pour la communication bidirectionnelle entre * navigateur * et le serveur. C'est un wrapper pour cacher les différences du navigateur et différents transports accessibles aux différents navigateurs. Si vous voulez une communication de serveur à serveur, vous avez beaucoup plus de choix (WebSockets, http, rpc, xmlrpc, votre propre protocole, files d'attente de messages - vous l'appelez) –

Répondre

0

Lorsque vous exécutez

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

vous ajoutez les deux callbacks que les auditeurs « résultat », et quand emit('result') se produit pour la première fois, à la fois rappel sont appelés (alors premier rappel se retire d'une liste). Vous devez définir des rappels sur un type d'objet de requête, pas sur un client.

code simple sur ce qui se passe dans votre client:

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

J'étais assez sûr que c'était le cas, et j'avais besoin d'aide Sors-moi de ma boucle. Merci :) – mobius