2012-05-05 29 views
6

Kilka miesięcy temu odkryłem nowjs i dnode i ostatecznie użyłem nowjs (i https://github.com/Flotype/nowclient) do dwukierunkowej komunikacji klient/serwer.Wyślij wiadomość z serwera do klienta z dnode

nowclient umożliwia teraz komunikację nowjs między procesami 2-węzłowymi (zamiast między procesem węzła a przeglądarką dla nowjsów po wyjęciu z pudełka). Byłem wtedy w stanie przesłać dane z klienta na serwer i z serwera do klienta. Teraz używam węzła 0.6.12 i bolesne jest użycie węzła 0.4.x do uruchomienia klienta.

Przybliżam dnode i nie jestem do końca pewien, jak działa serwer do komunikacji z klientem. Czy to możliwe, że serwer wysyła bezpośrednią wiadomość do klienta? Chodzi o to, aby klient zarejestrował się na serwerze (przy pierwszym połączeniu) i umożliwił serwerowi skontaktowanie się z klientem, gdy zajdzie taka potrzeba.

Z tego co rozumiem, wywołanie metody na serwerze jest możliwe, jeśli klient zażądał czegoś z serwera na pierwszym miejscu. Czy to jest poprawne ?

Odpowiedz

11

dnode używa protokołu symetrycznego, więc każda ze stron może zdefiniować funkcje, które może wywołać strona przeciwna. Istnieją dwa podstawowe podejścia, które możesz podjąć.

Pierwszym sposobem jest zdefiniowanie funkcji rejestru po stronie serwera i przekazanie wywołania zwrotnego od klienta.

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) 

klient:

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

lub zamiast można bezpośrednio zadzwonić do klienta z serwerem w symetryczny sposób po wymianie metoda jest kompletna:

serwer:

var dnode = require('dnode'); 

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

klient:

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

Dzięki za wyjaśnienia. Czy klient może być podłączony do serwera i czekać na przychodzące połączenie przychodzące z serwera? Czy istnieje również identyfikator klienta, który może być używany po stronie serwera? – Luc

+0

Użyłem conn.id i remote do śledzenia klientów. To działa naprawdę świetnie. – Luc

+1

Po prostu uświadomiłem sobie, że ta odpowiedź pochodzi z samego siebie. <3 dat guy - tyle niesamowitych modułów! – MiniGod

Powiązane problemy