2012-05-05 15 views
6

2ヶ月前に私はnowjsとdnodeを発見し、クライアント/サーバーの双方向通信にnowjs(とhttps://github.com/Flotype/nowclient)を使用しました。dnodeでサーバーからクライアントにメッセージを送信

nowclient nowjsは2つのノードプロセス間で通信できます(ノードプロセスとブラウザの間ではなく、すぐに使用できます)。その後、クライアントからサーバーに、そしてサーバーからクライアントにデータを送信することができました。私は現在、ノード0.6.12を使用しています。ノード0.4.xを使用してクライアントを実行するのは面倒です。

私はdnodeを詳しく見ていますが、サーバーとクライアントの通信がどのように機能しているかはわかりません。サーバーがクライアントにダイレクトメッセージを送信する可能性はありますか?この考え方は、(最初​​の接続時に)クライアントをサーバーに登録し、必要なときにサーバーがクライアントに接続できるようにすることです。

私が理解しているように、クライアントが最初にサーバから何かを要求した場合、サーバ上でメソッドを呼び出すことは可能です。あれは正しいですか ?

答えて

11

dnodeは対称プロトコルを使用しているため、どちらの側でも相手側が呼び出せる機能を定義できます。 2つの基本的なアプローチがあります。

最初の方法は、サーバー側でレジスタ関数を定義し、クライアントからコールバックを渡すことです。

サーバー:

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) 

クライアント:

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

または代わりに、メソッドの交換が完了すると、あなたが直接、対称的に、サーバーからクライアントを呼び出すことができます。

サーバー:

var dnode = require('dnode'); 

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

クライアント:あなたの明確化のため

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

感謝。クライアントをサーバーに接続し、サーバーからの着信を待つことはできますか?また、使用されているサーバー側で使用できるクライアント識別子はありますか? – Luc

+0

conn.idとremoteを使ってクライアントを追跡しました。それは本当に素晴らしいです。 – Luc

+1

ちょうどこの答えが彼自身からサブスタックからであることに気づいた。 <3 dat guy - とても素晴らしいモジュール! – MiniGod

関連する問題