ActiveMQ系列—消息协议(XMPP协议)
来源:互联网 发布:去马赛克软件 编辑:程序博客网 时间:2024/06/10 07:13
叙述:基本概念
1、消息
首先有三个基本概念在开篇前我们需要进行讨论:消息、消息协议、消息队列。消息既是信息的载体,这个描述相信各位读者都能够明白。为了让消息发送者和消息接收者都能够明白消息所承载的信息(消息发送者需要知道如何构造消息;消息接收者需要知道如何解析消息),它们就需要按照一种统一的格式描述消息,这种统一的格式称之为消息协议。所以,有效的消息一定具有某一种格式;而没有格式的消息是没有意义的。
而消息从发送者到接收者的方式也有两种。一种我们可以称为即时消息通讯,也就是说消息从一端发出后(消息发送者)立即就可以达到另一端(消息接收者),这种方式的具体实现就是我们已经介绍过的RPC(当然单纯的http通讯也满足这个定义);另一种方式称为延迟消息通讯,即消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端。 这个容器的一种具体实现就是消息队列。
2、知识结构
消息队列和已经介绍过的RPC相同的是:无论是RPC也好,消息队列也好他们都建立在网络IO模型基础上(我们已经介绍过多种网络IO模型)。先进的网络IO模型将赋予MQ协议优异的性能表现(当然,性能也不仅仅取决于网络IO模型)。
从上图可以看到,某一种消息通讯软件(或者叫做程序库)的实现都建立在“协议”基础上:RMI程序库建立在RMI协议上(RMI协议是JAVA规范协议的一部分) ,属于一种“即时消息通讯”;RabbitMQ和Qpid消息通讯软件的设计依据是AMQP协议,属于一种“延迟消息通讯”。
虽然消息协议存在“私有协议”和“开放协议”之分(是否向行业开放消息规范文档、是否允许某个组织更改协议),虽然某一个软件(程序库)不一定只支持一种协议(例如ActiveMQ实现了多种消息协议),虽然某一种协议也不一定只有一种软件(程序库)实现(例如能够支持webservice协议的程序库就有Codehaus XFire、Apache CXF、Jboss RESTEasy等),但是这并不影响“某一种消息通讯软件(或者叫做程序库)的实现都建立在“协议”基础上”的概念,反而是这个基本概念加强了。
接下来介绍XMPP协议
1、定义
XMPP is the Extensible Messaging and Presence Protocol, a set of open technologies for instant messaging, presence, multi-party chat, voice and video calls, collaboration, lightweight middleware, content syndication, and generalized routing of XML data.
以上内容引用自XMPP官网,这个定义已经可以清楚表明XMPP协议的用途和特性。XMPP的前身是Jabber,一个开源形式组织制定的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。
XMPP基于XML,用于IM系统的开发。国内比较流行的XMPP服务器叫做Openfire,它使用MINA作为下层的网络IO框架(不是MINA2是MINA1);国外用的比较多的XMPP服务器叫做Tigase,它的官网号称单节点可以支撑50万用户在线,集群可以支持100万用户在线:(http://projects.tigase.org/)
Cluster with over 1mn online users . 500k online users on a single machine
当然如果读者所在公司需要开发IM系统,除了使用现成的XMPP服务器以外,还需要实现了XMPP协议的客户端或者开发包(以便进行扩展开发)。您可以在XMPP官网查看到XMPP官方推荐的开发包,各种语言的支持基本上都有:http://xmpp.org/software/libraries.html
2、协议通讯过程示例
为了让各位读者对XMPP协议有一个感性认识,这里我们给出一个XMPP协议处理“IM用户登录”操作的过程(XMPP的登录方式分为有用户密码和无用户密码两种方式,这里我们介绍无密码登录方式)。
XMPP协议本身细节比较丰富,这里我们只讨论登录操作,如果读者有兴趣可以下载全套的XMPP官方规范文档进行研究(http://xmpp.org/):
通过上图可以看到,XMPP协议中的xml片段。这里出现了几个XMPP协议中的关键信息,例如:
stream标记:通讯流标记,是指XMPP的客户端或者服务器端向对方发起的通讯请求(或者响应)。通讯流并不携带正真的内容信息,只是表明客户端和服务器端发生了一次交互。stream的属性包括:to、from、id、xml:lang、version等;
iq标记:iq标记是Info/Query的简称(你可以理解成查询信息请求),一般是以组的形式出现,由客户端发起查询请求,由服务器端返回查询结果。由于查询请求的类型不一样,iq标记中可以嵌入的子标记就有很多。例如,可以嵌入bind标记,表明某个用户和jid的绑定关系;可以嵌入多个item标记,表明查询得到的这个用户的好友信息(如下):
<iq to='somenode@example.com/someresource' type='result' id='roster'> <query xmlns='jabber:iq:roster'> <item jid='friend1@example.com' name='someone1'/> <item jid='friend2@example.com' name='someone2'/> </query> </iq>
- jid标记:jid(JabberID)是XMPP协议中标示,它用来标示XMPP网络中的各个XMPP实体(实体可以是某一个用户、某一个服务器、某一个聊天室),规范格式如下:
jid = [ node "@" ] domain [ "/" resource ]
- 还有未出现的message、presence标记:message是实体内容标记,记录了聊天的真实内容;presence标记表示了XMPP用户的服务状态(离线,在线、忙碌等)。示例如下:
<message to="somenode@example.com/someresource" type="chat"> <body>helloword。。。</body> </message>
- ActiveMQ系列—消息协议(XMPP协议)
- ActiveMQ系列—消息协议(Stomp协议)
- ActiveMQ系列—消息协议(AMQP协议)
- Android 消息推送 Xmpp协议
- ActiveMQ - tcp 协议发送消息
- ActiveMQ - tcp 协议接收消息
- ActiveMQ - stomp 协议发送消息
- ActiveMQ - stomp 协议接收消息
- XMPP协议(-)
- XMPP协议学习笔记五(Openfire消息处理流程)
- 基于XMPP协议(openfire服务器)的消息推送实现
- 实现可扩展消息传递和到场协议(XMPP)
- 实现可扩展消息传递和到场协议(XMPP)
- 基于XMPP协议(openfire服务器)的消息推送实现
- 实现可扩展消息传递和到场协议(XMPP)
- 基于XMPP协议(openfire服务器)的消息推送实现
- 实现可扩展消息传递和到场协议(XMPP)
- Android消息推送(主: XMPP协议实现Android推送)
- 高效率秘籍
- 云计算学习关键字(待补充...)
- LeetCode 209. Minimum Size Subarray Sum
- String、StringBuffer与StringBuilder之间区别
- ValueAnimator和ObjectAnimator
- ActiveMQ系列—消息协议(XMPP协议)
- 社团检测经典数据集
- 后起之秀的中国 在世界AI竞赛场加速超车
- rt-thread的链表
- gcc g++编译器
- Django报编码错误的解决办法
- 【前端知识点】15分钟带你彻底了解nodejs的那些特点
- HDU3605 Escape【网络流】
- c++find函数