Invia un messaggio dal server al client con dnode

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.

nowclient consente la comunicazione nowjs tra 2 processi di nodo (anziché tra un processo di nodo e un browser per nowjs out of the box). 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.

Dando un’occhiata più da vicino a dnode e non sono sicuro di come funzioni la comunicazione tra server e client. È ansible 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 è ansible se il client ha richiesto qualcosa dal server al primo posto. È corretto ?

dnode usa un protocollo simmetrico in modo che entrambi i lati possano definire le funzioni che il lato opposto può chiamare. Ci sono 2 approcci di base che puoi seguire.

Il primo modo è definire una funzione di registro sul lato server e passare una richiamata 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); }); }); 

oppure puoi chiamare direttamente il client dal server in modo simmetrico una volta completato lo scambio di metodi:

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