用户能即时的收到来自系统或者其他用户发来的消息,在web界面右下角弹窗提醒,用户还能标记消息是否已阅状态。
概念:即时通讯(实时通信,Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。
即时通讯有多方面的应用:即时消息、群组聊天、游戏、系统控制、地理定位、中间件和云计算、数据同步、网络语音通话、身份服务。
情景:
“我们已经到了吗?”,车后面的小孩儿问道,“没,还没有到”,一个成年人回答到。过了一会儿,小孩儿问道:“我们现在到了吗?”。这种时间短但频率高的重复性交换是一个轮询系统的真实例子:小孩儿不知道汽车什么时候到达目的地,这样他经常向开车的成年人确认。那就是,小孩儿正在轮询信息。通常成年人回复不会花太长时间:“当我们到那儿的时候,我会告诉你”。在这个例子中,这有助于和小孩儿一起旅行的成年人保持头脑清楚;在英特网上,它具有节省带宽和服务器资源的双重目的(不会再有“它变化了吗?”,“没,还没有”的交换),并且确保订阅人接收到更新和网络传递给他们的信息是一样的,而不是只有在下次由订阅人轮询来源。这跟我们平常基于“请求响应”方式来开发网站的理念不同,它属于”发布订阅”的概念,或者说“推送”的概念。
可扩展通讯与表示协议(XMPP)是一项用于实时通讯的开放技术。它使用可扩展标记
语言(xml)作为交换信息的基本格式。所谓协议,就是实现即时通讯的一组约定。
XMPP可以提供以下核心服务:信道加密、认证、出席、联络清单、一对一消息、多方通讯消息、通知、服务发现、能力广告、结构化数据表单、工作流管理、对等网络媒体会话。
图 1XMPP 的 client-server 架构
XMPP,在本质上,是一种 XML 流技术。当你准备开始和 XMPP 服务器会话,你打开一
个长时间在线的 TCP 连接,然后和服务器协商一个 XML 流(服务器也同样也打开一个流,
例如在每个方向有一个流)。是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
XML 流 例子:
C: C: C:
S:
C: to="[email protected]"> Off with his head!
S: to="[email protected] "> You are all pardoned. C: C: |
服务端:djabberd、ejabberd、jabberd、jabberd2、Prosody、Tigase等。
是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。
客户端(桌面版):Coccinella、Jeti、Psi、Swift、Tkabber等(类似于rtx、qq、tim、微信)。
Spark 是一个面向商业的客户端,并和 Openfire 服务器紧密关联。除了和 Openfire 服务器 的 集 成 外 , 它 也 提 供 了 半 专 有 的 音 频 和 视 频 通 讯 能 力 。 许 可 证 : LGPL 。 网 址 :http://www.igniterealtime.org/projects/spark/。
客户端(web):Jabbear、JWChat、SparkWeb等(类似于wechat网页版)。
工具库:
Smack 是一个非常流行、全功能的库,用于编写客户端、机器人和其他的应用程序。它
由创建了 Openfire 服务器和 Spark 客户端的开发者编写。许可证: Apache。网址:
http://www.igniterealtime .org/projects/smack/。
Strophe 是一个具有良好文档化的库,用于开发 XMPP 客户端,包括强大的 TLS 和 SASL支持。Strophe 有两种形式:C(libstrophe)和 JavaScript(strophejs)。许可证:GPL。网址:http://code.stanziq.com/strophe/。
提交信息:标题(内容)、类型、附加属性(url、数据)、业务标识、发送方信息、接受方信息等。发送方信息、接受方信息包含用户名、系统标识。
中间件:可选。比如可以是spring cloud的Feign、spring cloud stream、rabbitmq。考虑到消息的高并发性,推荐使用消息中间件spring cloud stream、rabbitmq。
信息处理:对提交的信息进行验证、存储等。
发送消息:使用smack api与openfire交互,将消息发送给相应的客户端。实现已封装在simba-component-xmpp包中。
消息中心发送逻辑关键代码:
自定义拓展节点MessageXMPP |
simba-component-xmpp关键代码:
创建链接 发送消息 |
消息提醒:消息接收者的web界面右下角出现窗口提醒消息。
Strophe.js关键代码:
添加消息监听处理器 connection.addHandler(function(message)); 登录认证 connection.connect(jid, pwd, function(status)); |
阅读消息:用户点击消息。
更新消息状态:更新状态位。
其他处理:可选。可根据不同的消息类型,进行不同的处理。如通知服务调用者当前消息已阅读。