2012-05-05 13 views
6

Un paio di mesi fa ho scoperto nowjs e dnode e infine ho usato nowjs (e https://github.com/Flotype/nowclient) per la comunicazione bidirezionale client/server.Invia messaggio dal server al client con dnode

nowclient consente la comunicazione tra nowjs 2 processi nodo (anziché tra un processo nodo e un browser per nowjs fuori dalla scatola). Sono stato quindi in grado di inviare dati dal client al server e dal server al client. Ora utilizzo il nodo 0.6.12 ed è piuttosto doloroso utilizzare il nodo 0.4.x per eseguire il client.

Sto dando uno sguardo più attento a dnode e io non sono davvero sicuro di come il server di comunicazione client sta lavorando. È possibile che il server invii un messaggio diretto al client? L'idea è di avere un client per registrarsi sul server (alla prima connessione) e consentire al server di contattare il client quando è necessario.

Da quello che ho capito, chiamare un metodo sul server è possibile se il cliente ha richiesto qualcosa dal server al primo posto. È corretto ?

risposta

11

dnode utilizza un protocollo simmetrico quindi o lato può definire funzioni che il lato opposto può chiamare. Ci sono 2 approcci di base che puoi seguire.

Il primo modo è quello di definire una funzione registro sul lato server e di passare in un callback dal client.

server:

var dnode = require('dnode'); 

dnode(function (remote, conn) { 
    this.register = function (cb) { 
     // now just call `cb` whenever you like! 
     // you can call cb() with whichever arguments you like, 
     // including other callbacks! 

     setTimeout(function() { 
      cb(55); 
     }, 1337); 
    }; 
}).listen(5000) 

cliente:

var dnode = require('dnode'); 

dnode.connect('localhost', 5000, function (remote, conn) { 
    remote.register(function (x) { 
     console.log('the server called me back with x=' + x); 
    }); 
}); 

o invece si può chiamare direttamente il client dal server in maniera simmetrica, una volta lo scambio metodo è completo:

server:

var dnode = require('dnode'); 

dnode(function (remote, conn) { 
    conn.on('ready', function() { 
     remote.foo(55); 
    }); 
}).listen(5000); 

cliente:

var dnode = require('dnode'); 
dnode(function (remote, conn) { 
    this.foo = function (n) { 
     console.log('the server called me back with n=' + n); 
    }; 
}).connect('localhost', 5000); 
+0

Grazie per i vostri chiarimenti. Un client può essere connesso a un server e attendere la chiamata in arrivo proveniente dal server? Inoltre, c'è un identificatore del client che può essere utilizzato dal lato server? – Luc

+0

Ho usato conn.id e il telecomando per tenere traccia dei client. Funziona davvero alla grande. – Luc

+1

Appena realizzato che questa risposta proviene dal substack stesso. <3 dat guy - tanti moduli fantastici! – MiniGod

Problemi correlati