使用dnode从服务器向客户端发送消息

时间:2012-05-05 12:26:28

标签: javascript node.js nowjs-sockets dnode

几个月前,我发现了nowjs和dnode,最后使用nowjs(和https://github.com/Flotype/nowclient)进行客户端/服务器双向通信。

nowclient启用了两个节点进程之间的nowjs通信(而不是在节点进程和浏览器之间进行现在开箱即用)。然后,我能够将数据从客户端发送到服务器,从服务器发送到客户端。我现在使用节点0.6.12,使用节点0.4.x来运行客户端是很痛苦的。

我正在仔细研究dnode,我不确定服务器与客户端的通信是如何工作的。服务器是否可能向客户端发送直接消息?我们的想法是让客户端在服务器上注册(在第一次连接时)并使服务器在需要时联系客户端。

根据我的理解,如果客户端首先从服务器请求了某些内容,则可以在服务器上调用方法。这是对的吗?

1 个答案:

答案 0 :(得分:10)

dnode使用对称协议,因此任何一方都可以定义对方可以调用的函数。您可以采取两种基本方法。

第一种方法是在服务器端定义一个寄存器功能,并从客户端传入一个回调。

服务器

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