Dnode是一个提供异步双向远程方法调用的类库。网络socket和websocket风格的socket.io通信已经成为可能,所以系统的进程之间可以相互通信并且可以与运行在浏览器端的用户进程使用相同的接口。
远程方法调用(RMI)是面向对象中远程过程调用的表兄弟。在RMI中,连接的每一端都持有另一端能够调用其方法的一个远程对象。
Dnode所有的远程方法调用都是异步的。不同于明确返回结果的做法,宿主的(远端)方法通过执行回调方法来“传递”返回值到另一个连接端(本地),而该回调是被作为一个参数传递过来的。这些回调在那些定义它们的一端(通常为客户端)被执行,并且它们的一个代理被传递到远程,所以这里没有eval()
下面是一个简单的例子:
// server: var DNode = require('dnode'); var server = DNode({ timesTen : function (n,f) { f(n * 10) }, }).listen(6060);
// client: var DNode = require('dnode'); var sys = require('sys'); DNode.connect(6060, function (remote) { remote.timesTen(5, function (result) { sys.puts(result); // 5 * 10 == 50 }); }); 接着,开启两个Cygwin客户端,分别编译并执行Server端代码和Client端代码:
Server:
Client:
不像许多异步RPC系统,Dnode允许程序员将函数作为参数传递给远程方法。回调会被自动地刷新并且从参数列表中递归被收集。所以它们可以被任意嵌套。
另外,连接的每一边都可以调用另一边的方法以及另一边提供的回调方法,这些回调方法可以为其自身也可以为任何可以被序列化为JSON参数的方法。