wamp是什么? 与websocket有什么区别?

由于在实验室的项目中使用到了WAMP,因此去搜了各大网站有关于这个协议的信息,可是网上的文章少之可怜,最为权威以及正确的也就是WAMP官网啦。因此接下来的知识讲解,都是笔者结合本身的实际经验以及用那点略显拙劣的英文水平翻译官网总结出来的,若是有错误也但愿你们积极的提出来,共同进步!!html

一样,为了更好的验证代码的正确,依旧是贴GitHub地址(可是地址路由器地址全都改啦,这个就须要本身配置安装啦!!) 前端

1、WAMP是什么?

1.1 介绍

WAMP(Web Application Messaging Protocol)是一种路由协议,全部组件都链接到WAMP路由器上,WAMP路由器在组件之间执行消息路由。其设计目的是为应用程序组件之间的实时消息交换提供开放标准。git

WAMP须要一个可靠的,有序的全双工消息通道做为传输层,默认状况下使用 WebSocket。可是,真正的实现也可使用与这些特性匹配的其余传输,好比原始套接字或HTTP长轮询与WAMP进行通讯,或者使用RawSocket。github

这里比较一下这两个传输协议:web

  • Websocket:使用Websocket传输,能够建立持久的双向链接。消息没有HTTP头,这能够最大限度的减小开销
  • RawSocket:RawSocket上的WAMP使用的二进制消息,不须要事先HTTP握手,具备较小的开销。可是它最大的缺点就是浏览器不容许TCP链接。要在Web浏览器上使用客户端,必须安装浏览器扩展,同时另外一个缺点是缺乏传输级压缩。

1.2 传递模式

WAMP提供了两种消息传递模式:编程

  • Publish & Subscribe(发布订阅)
  • routed Remote Procedure Calls (rRPC)(路由远程过程调用)

发布和订阅

发布和订阅是一种已创建的消息传递模式。其中组件(订阅者)通知路由器它想要接收的主题的信息(也就是它要订阅主题),而后,另外一个组件(发布者)能够发布关于某个主题的消息,最后。路由器将事件分发给全部订阅该主题的组件。后端

路由远程过程调用

路由远程过程调用依赖于发布和预约模式。一个组件(Callee)向路由器提供一个特定的过程。其余组件(Callers)能够调用该过程。路由器调用Callee上的过程,接收过程的结果,而后将此结果转发回Caller。数组

路由RPC和传统的客户端-服务端RPC的不一样之处在于路由器充当呼叫者和被呼叫者之间的中介,传统的RPC直接调用(通俗讲:RPC 是指计算机 A 上的进程,调用另一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。)浏览器

路由RPC的优势bash

  • 由于全部消息都在WAMP路由上,所以再也不须要在Callee和Caller之间创建直接网络链接或路径。

2、WAMP中的消息路由

WAMP在开放的WebSocket协议中提供统一的应用程序路由,该协议适用于不一样的语言。

使用WAMP,能够从应用程序组件构建分布式系统,这些组件低耦合实时通讯。

先在这里列出WAMP的一些特色(优势)

  • 低耦合
  • 基于组件
  • 实时通讯
  • 语言独立

2.1 低耦合

WAMP提供了咱们称之为应用程序通讯的统一应用程序路由

  • 发布和订阅者模式中的事件路由
  • 远程过程调用模式中的呼叫路由

接下来让咱们分别比较传统方式与WAMP中发布订阅模式和路由远程过程调用得出这些特色。

传统方式

先看一看传统方式“客户端-服务器”的模式,在这种模式中,远程过程调用直接从主叫方到被叫方:

在客户端-服务器模型中,调用者须要了解被调用者所在的位置以及如何访问它。这就引入了调用者和被调用这之间的强大耦合,所以应用程序可能很快就会变得很复杂难以维护。

WAMP中的发布-订阅模式

在该模式中,发布者将消息(主题)传递给事件路由,而且订阅者仅仅是经过对消息(主题)的订阅,在事件路由接收到该消息(主题)后,将消息(主题)传递给订阅者。

整个过程当中,发布者和订阅者之间是间接的完成整个过程的,对方都不须要了解彼此

WAMP中的路由远程过程调用

这个过程和发布-订阅的模式相似,当调用者想要调用远程过程时,它会和呼叫路由通讯,而且只提供调用过程的URI以及调用参数,而后呼叫路由会在注册的被调用者中进行查找并调用,以后将结果路由回来。二者之间没有直接的调用。

以上三种模式的比较能够得出,WAMP提供的两种模式都是经过添加路由器(或者通俗理解就是中介),免去调用者和被调用者之间的之间交流,以较低组件之间的耦合。这也是WAMP的优势之一了。

2.2基于组件

若是将事件路由(Broker--用于发布订阅)和呼叫路由(Dealer--用于路由远程过程调用)组合在一块儿就会获得WAMP中路由器

若是将这二者组合成一个路由器,那么这一个路由器就能够担任起两个做用。

2.3 实时

WebSocket是一种新的Web协议,它能够在须要双向实时通讯时克服HTTP的限制,而且它提供了与Web和浏览器兼容的双向实时消息传递,除此以外,还能够在费浏览器环境中运行WebSocket。

WAMP是一个正式注册的WebSocket子协议(运行在WebSocket之上),使用JSON做为消息序列化格式。

由于WAMP也支持实时双向通讯。

2.4 语言无关

WAMP拥有许多常见和不常见的语言功能的一流支持。

这也就意味着WAMP能够实现及时使用--无需关心语言。

3、比较WAMP

根据如下六个标准对WAMP以及AJAX、Socket.IO和MQTT进行比较(其它技术没有使用过,在这很少阐述)

3.1 六个标准

  • 是否支持发布订阅模式
  • 是否支持远程过程调用
  • 是否支持路由远程过程调用
  • 是否适用于不一样的编程语言
  • 是否有开放式的官方标准
  • 是否自己就运行在网络
技术 发布订阅 RPC 路由RPC 网络原生 跨语言 开放标准
WAMP
MQTT - - -
Socket.IO - - - -
AJAX - - -

AJAX

AJAX既不是协议也不是API,而是浏览器中JavaScript的编程模式,它使用HTTP请求实现前端(浏览器)和后端之间相似RPC的通讯。

即便使用AJAX实现了RPC机制,这也是点对点RPC,调用不是在不一样服务器或应用程序至今路由,而是严格从点(浏览器)到点(浏览器链接到的服务器),除此以外,AJAX不提供发布订阅模式(能够说是没有解决服务器主动推送消息到服务器)。

由于AJAX使用普通的HTTP头信息,因此它的开销和限制会比较大。

Socket.IO

Socket.IO是一个用JavaScript编写的客户端-服务端(发布订阅)的服务实现。使用服务器端的Node.js和浏览器进行通讯。

与WAMP相比,Socket.IO库容许订阅不一样的主题,具备广播消息和消息命名空间的功能。二进制数据传递是可能的,可是须要双方的二外模块(Socket.io-stream)。

Socket.IO不提供远程过程调用。

4、实现

4.1 Library(库)

为了在不一样语言上编写程序组件,须要选择适合的WAMP库。也就是说,我使用不一样的语言,要选择该语言版本的库。

这里只说一下 AutobahnJS,该库能够运行在JavaScript、HTML5以及NodeJS环境中。

贴一个GitHub地址,详细介绍参看这个网址就能够了,其实它的使用理解下来与Socket.IO差很少,只不过在使用以前须要在服务器上安装路由器(下面会讲),这里就贴一下基本使用的代码。

模式一:发布订阅模式

publicer(发布者)代码:

//引入库
var autobahn = require('autobahn');
//建立链接
var connection = new autobahn.Connection({
   url: 'ws://xxx.xxx.xxx:xxx/ws', //路由器的地址
   realm: 'realm1' //域(相似于Socket.io中的命名空间)
});

//监听链接
connection.onopen = function (session) {
   console.log('链接成功');
   //发布消息,第一个参数为主题,第二个参数为发布内容
   session.publish('wamptopic', ['Hello,World!']);
};
//打开链接
connection.open();
复制代码

receiver(订阅者)代码:

//引入库
var autobahn = require('autobahn');
//建立链接
var connection = new autobahn.Connection({
   url: 'ws://xxx.xxx.xxx.xxx:xxx/ws', //路由器的地址
   realm: 'realm1' //域(相似于Socket.io中的命名空间)
});
//监听链接
connection.onopen = function (session) {
   function onEvent(args) {
      var msg = args[0];
      console.log(" received: " + msg);
   }
   //订阅主题,第一个参数是主题,第二个参数是接收信息的回调函数
   session.subscribe('wamptopic', onEvent)
};
//打开链接
connection.open();
复制代码

注意

  • 必定要保证订阅者和发布者所在的域是同样的(即要保证ream的值是同样的)
  • 订阅者在收到的数据是一个数组(文档提供)

模式二:路由远程调用模式

callee(调用者)

//引入库
var autobahn = require('autobahn');
//建立链接
var connection = new autobahn.Connection({
    url: 'ws://xxx.xxx.xxx.xxx:xxx/ws', //路由器的地址
    realm: 'realm1' //域(相似于Socket.io中的命名空间)
});
//监听链接
connection.onopen = function (session) {
    function onEvent(args) {
        return args[0] + args[1];
    }
    //订阅主题,第一个参数是主题,第二个参数是接收、处理并返回信息的回调函数
    session.register('wamptopic', onEvent)
};
//打开链接
connection.open();
复制代码

caller(被调用者)

//引入库
var autobahn = require('autobahn');
//建立链接
var connection = new autobahn.Connection({
    url: 'ws://xxx.xxx.xxx.xxx:xxx/ws', //路由器的地址
    realm: 'realm1' //域(相似于Socket.io中的命名空间)
});

//监听链接
connection.onopen = function (session) {
    console.log('链接成功');
    //发布消息,第一个参数为主题,第二个参数为传递的参数,以后是接收调用的返回结果
    session.call('wamptopic', [2, 3]).then((res) => {
        console.log('结果', res)
    })
};
//打开链接
connection.open();
复制代码

4.2 Routers(路由器)

官网上提供了不少路由器的库,由于笔者实验室用到的是Crossbar,因此对于其余路由库的配置也不清楚。配置好以后的地址就是笔者在上面xxx.xxx.xxx.xxx:xx所替代的东西。 官网上的配置步骤很是的详细,即便如此,可能会遇到各类Bug,这就须要就不一样的问题本身进行解决啦~~

5、与websocket有什么区别

讲到这里,其实WAMP的使用以及与Websocket的关系和区别,在上面几乎都已经说明,若是没有彻底读懂,说明可能对WebSocket不太熟悉,那么这里笔者毛遂自荐了解Websocket及Socket.io去读一读,再来和这篇文章做对比,就会发现它们的关系和区别啦~~~

相关文章
相关标签/搜索