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博客。

目录
相关文章
|
2月前
|
移动开发 JavaScript 前端开发
一些处理浏览器兼容性问题的JavaScript库
这些库在处理浏览器兼容性问题方面都有着各自的特点和优势,可以根据具体的需求和项目情况选择合适的库来使用,从而提高代码的兼容性和稳定性,为用户提供更好的体验。同时,随着浏览器技术的不断发展,还需要持续关注和学习新的兼容性解决方案。
112 48
|
2月前
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
2月前
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
在浏览器执行js脚本的两种方式
|
2月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
|
2月前
|
算法 开发者
Moment.js库是如何处理不同浏览器的时间戳格式差异的?
总的来说,Moment.js 通过一系列的技术手段和策略,有效地处理了不同浏览器的时间戳格式差异,为开发者提供了一个稳定、可靠且易于使用的时间处理工具。
50 1
|
2月前
|
存储 JavaScript 网络协议
浏览器与 Node 的事件循环
浏览器和Node.js的事件循环是异步操作的核心机制。它们通过管理任务队列和回调函数,确保程序在处理耗时任务时不会阻塞主线程,从而实现高效、响应式的应用开发。
|
2月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
353 9
|
2月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
185 1
|
3月前
|
前端开发 JavaScript 开发者
JS 异步解决方案的发展历程以及优缺点
本文介绍了JS异步解决方案的发展历程,从回调函数到Promise,再到Async/Await,每种方案的优缺点及应用场景,帮助开发者更好地理解和选择合适的异步处理方式。
|
3月前
|
移动开发 JavaScript 前端开发
【JavaScript】JS执行机制--同步与异步
【JavaScript】JS执行机制--同步与异步
33 1