使用dnode向客户端发送消息的服务器端实现

5
几个月前,我发现了nowjs和dnode,并最终使用nowjs(以及https://github.com/Flotype/nowclient)进行客户端/服务器双向通信。nowclient使得两个节点进程之间可以进行nowjs通信(而不是仅限于一个节点进程和浏览器)。然后,我能够从客户端向服务器发送数据,也能够从服务器向客户端发送数据。我现在使用的是node 0.6.12版本,但是使用node 0.4.x版本运行客户端有些麻烦。
我正在仔细研究dnode,但我不太确定服务器到客户端的通信是如何工作的。服务器是否可以直接向客户端发送消息?我的想法是让客户端在连接时注册到服务器上,并使服务器能够在需要时联系客户端。
据我所知,在客户端首次请求服务器时调用服务器上的方法是可能的。这正确吗?
1个回答

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

感谢您的澄清。客户端能够连接到服务器并等待来自服务器的呼入电话吗?此外,是否有客户端标识符可以在服务器端使用? - Luc
我使用conn.id和remote来跟踪客户端,这非常有效。 - Luc
1
刚刚意识到这个答案是来自Substack本人。我喜欢那个家伙——有很多很棒的模块! - MiniGod
是啊,他很厉害!我在尝试弄清楚如何使用UDP流使其工作,但事件发生在初始加载后。似乎所有的例子都是关于在首次加载时进行通信(d.on())。你们中有人知道如何为后续事件做到这一点吗? - wayofthefuture

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接