2012-05-05 73 views
6

一对夫妇一个月前,我发现nowjs和dnode最后使用nowjs(和https://github.com/Flotype/nowclient)客户端/服务器的双向通信。从服务器发送信息到客户端dnode

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

我给仔细看看dnode,我真的不知道如何服务器端到客户端的通信工作。服务器是否可能向客户端发送直接消息?这个想法是让一个客户端在服务器上注册(在第一次连接时),并让服务器在需要时联系客户端。

据我所知,调用服务器上的方法是可能的,如果客户已要求服务器在事放在第一位。那是对的吗 ?

回答

11

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

感谢您的澄清。客户端可以连接到服务器并等待来自服务器的来电吗?另外,是否有可以使用服务器端的客户端标识符? – Luc

+0

我用conn.id和remote来跟踪客户端。这工作真的很棒。 – Luc

+1

刚刚意识到这个答案来自于他自己。 <3 dat家伙 - 这么多真棒模块! – MiniGod

相关问题