Dnode:基于Node.js给浏览器提供异步远程方法调用

简介:

Dnode介绍

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参数的方法。

双向范例

这里有一个关于客户端调用服务端的一个方法,而服务端又调用客户端的一个方法的例子:

// server:
var DNode = require('dnode');

DNode(function(client){
	this.timesX=function(n,f){
		client.x(function(x){
			f(n*x);
		});
	}
}).listen(6060);

// client:
var DNode = require('dnode');
var sys = require('sys');

DNode({
	x:function(f){ f(20) }
}).connect(6060,function(remote){
		remote.timesX(3,function(res){
			sys.puts(res);
		}
	});

});

执行方法同上,效果如下:

DNode浏览器示例

在浏览器与node.js Dnode服务器之间的websocket形式的连接的可行性需要感谢socket.io。接下来的示例应该运行在Chrome、Firefox、Opera以及IE 5.5+以上的版本。

本示例来自node_modules\dnode\examples\web-http下:

server.js

var http = require('http');
var fs = require('fs');
var dnode = require('dnode');

var index = fs.readFileSync(__dirname + '/index.html');

var server = http.createServer(function (req, res) {
    if (req.url === '/') {
        res.writeHead(200, { 'Content-Type' : 'text/html' });
        res.end(index);
    }
});

dnode(function (client) {
    this.cat = function (cb) {
        cb('meow');
    };
}).listen(server);

server.listen(6857);
console.log('http://localhost:6857/');


注解:__dirname表示当前文件所在文件夹,fs.readFileSync方法为同步读取文件,返回值是二进制流。


index.html

<html>
<head>
<script src="/dnode.js" type="text/javascript"></script>
<script type="text/javascript">
    window.onload = function () {
        DNode.connect(function (remote) {
            remote.cat(function (says) {
                document.getElementById('says').innerHTML = says;
            });
        });
    };
</script>
</head>
<body>
The cat says <span id="says">?</span>.
</body>
</html>

编译:


注:必须定位到文件所在的目录才可以使用node命令后面跟相对路径下的文件名编译JS。

在浏览器地址栏敲入:http://localhost:6857/,便可得到如下输出:


解析:因为http服务端正在监听来自6857端口,当发现有请求,并且发现后面跟有“/”,则输出index.html到客户端。由于服务端的DNode侦听6857端口,而客户端页面加载完成,就开始连接服务端的DNode,并执行回调。来自服务端的代理(remote),执行定义在服务端的方法cat(),方法cat需要一个函数(客户端定义)作为参数。
最终ID为says的span标签的文本就变为meow。

安装

Dnode可以通过npm获得,npm是一个node.js库的包管理器。你可以通过下面的命令安装(在cygwin中执行下面的命令):

npm install dnode

Dnode依赖于如下的Module:Socket.IO-node, bufferlist 、traverse。所有的这些都可以通过npm获得,并且当你在执行完上面的命令之后,它们已经自动安装了。

当然还有一些有趣的范例都在dnode的example,有兴趣的童鞋可以自己研究一下~



原文发布时间为:2011-10-27


本文作者:vinoYang


本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

目录
相关文章
|
19天前
|
JavaScript
浏览器插件crx文件--JS混淆与解密
浏览器插件crx文件--JS混淆与解密
20 0
|
19天前
|
JavaScript 前端开发 安全
JavaScript与浏览器的执行平台有何不同?
【4月更文挑战第22天】JavaScript与浏览器的执行平台有何不同?
21 2
|
19天前
|
存储 移动开发 JavaScript
JavaScript和浏览器
【4月更文挑战第22天】JavaScript和浏览器
21 4
|
2天前
|
前端开发 JavaScript 数据处理
在JavaScript中,异步函数是指什么
【5月更文挑战第9天】JavaScript中的异步函数用于处理非立即完成的操作,如定时器、网络请求等。它们可通过回调函数、Promise或async/await来实现。示例展示了如何使用async/await模拟网络请求:定义异步函数fetchData返回Promise,在另一异步函数processData中使用await等待结果并处理。当fetchData的Promise解析时,data变量接收结果并继续执行后续代码。注意,调用异步函数不会阻塞执行,而是会在适当时间点继续。
7 0
|
4天前
|
移动开发 JavaScript 前端开发
javascript监听浏览器离开、进入行为
javascript监听浏览器离开、进入行为
10 0
|
7天前
|
JavaScript 前端开发 开发者
JavaScript基础入门之浏览器控制台调试输出
本文章是对小白学习js的初级教程,也是我对自己学习经验的一种总结,文章大多采用使用案例加讲解,带动学习的方式.因为我们的天性总是喜欢有及时反馈的事物,但是学习是一个慢长的事情,而有结果的回应,才会更好的促进自己去学习,主要是对于javascript学习中的输出,有个大体上的了解,同时通过教学能够更好的使用浏览器来方便我们去学习和运行代码,也是对自己进行笔记整理,对抓住信息关键点的一种提高.
|
12天前
|
JavaScript 大数据 开发者
Node.js的异步I/O模型与事件循环:深度解析
【4月更文挑战第29天】本文深入解析Node.js的异步I/O模型和事件循环机制。Node.js采用单线程与异步I/O,遇到I/O操作时立即返回并继续执行,结果存入回调函数队列。事件循环不断检查并处理I/O事件,通过回调函数通知结果,实现非阻塞和高并发。这种事件驱动编程模型简化了编程,使开发者更专注业务逻辑,为高并发场景提供高效解决方案。
|
23天前
|
JavaScript 前端开发
JavaScript如何获得浏览器的宽高
JavaScript如何获得浏览器的宽高
|
23天前
|
JavaScript 前端开发
JavaScript BOM 浏览器对象模型
JavaScript BOM 浏览器对象模型
|
24天前
|
JavaScript 安全 前端开发
js控制浏览器前进、后退、页面跳转
js控制浏览器前进、后退、页面跳转
21 3