2012-05-05 12 views
6

Hace un par de meses descubrí nowjs y dnode y finalmente usé nowjs (y https://github.com/Flotype/nowclient) para la comunicación bidireccional cliente/servidor.Enviar mensaje del servidor al cliente con dnode

nowclient habilita la comunicación ahorajs entre procesos de 2 nodos (en lugar de entre un proceso de nodo y un navegador para ahora js). Pude enviar datos del cliente al servidor y del servidor al cliente. Ahora uso el nodo 0.6.12 y es un poco doloroso usar el nodo 0.4.x para ejecutar el cliente.

Le estoy dando una mirada más cercana al dnode y no estoy muy seguro de cómo funciona la comunicación entre el servidor y el cliente. ¿Es posible que el servidor envíe un mensaje directo al cliente? La idea es hacer que un cliente se registre en el servidor (en la primera conexión) y permitir que el servidor se comunique con el cliente cuando lo necesite.

Por lo que entiendo, es posible llamar a un método en el servidor si el cliente ha solicitado algo al servidor en primer lugar. Es eso correcto ?

Respuesta

11

dnode usa un protocolo simétrico para que cualquiera de los lados pueda definir las funciones que el lado opuesto puede invocar. Hay 2 enfoques básicos que puede tomar.

La primera forma es definir una función de registro en el servidor y pasar una devolución de llamada desde el cliente.

servidor:

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 en su lugar se puede llamar directamente al cliente desde el servidor de forma simétrica una vez que el cambio de método es completa:

servidor:

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

Gracias por sus aclaraciones. ¿Puede un cliente estar conectado a un servidor y esperar que las llamadas entrantes provengan del servidor? Además, ¿hay un identificador de cliente que pueda usar el lado del servidor usado? – Luc

+0

Utilicé conn.id y remoto para realizar un seguimiento de los clientes. Eso está funcionando realmente bien. – Luc

+1

Acabo de darme cuenta de que esta respuesta es de sí mismo. <3 dat chico - tantos módulos increíbles! – MiniGod

Cuestiones relacionadas