5

数か月前、私は nowjs と dnode を発見し、最終的にクライアント/サーバーの双方向通信に nowjs (およびhttps://github.com/Flotype/nowclient ) を使用しました。

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

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

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

4

1 に答える 1

10

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);
于 2012-05-08T13:22:48.037 に答える