消息中心(系统消息)实现

  • 需求

用户能即时的收到来自系统或者其他用户发来的消息,在web界面右下角弹窗提醒,用户还能标记消息是否已阅状态。

  • 即时通讯

概念:即时通讯(实时通信,Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。

即时通讯有多方面的应用:即时消息、群组聊天、游戏、系统控制、地理定位、中间件和云计算、数据同步、网络语音通话、身份服务。

  • 为什么使用即时通讯

情景:

“我们已经到了吗?”,车后面的小孩儿问道,“没,还没有到”,一个成年人回答到。过了一会儿,小孩儿问道:“我们现在到了吗?”。这种时间短但频率高的重复性交换是一个轮询系统的真实例子:小孩儿不知道汽车什么时候到达目的地,这样他经常向开车的成年人确认。那就是,小孩儿正在轮询信息。通常成年人回复不会花太长时间:“当我们到那儿的时候,我会告诉你”。在这个例子中,这有助于和小孩儿一起旅行的成年人保持头脑清楚;在英特网上,它具有节省带宽和服务器资源的双重目的(不会再有“它变化了吗?”,“没,还没有”的交换),并且确保订阅人接收到更新和网络传递给他们的信息是一样的,而不是只有在下次由订阅人轮询来源。这跟我们平常基于“请求响应”方式来开发网站的理念不同,它属于”发布订阅”的概念,或者说“推送”的概念。

  • XMPP

可扩展通讯与表示协议(XMPP)是一项用于实时通讯的开放技术。它使用可扩展标记

语言(xml)作为交换信息的基本格式。所谓协议,就是实现即时通讯的一组约定。

XMPP可以提供以下核心服务:信道加密、认证、出席、联络清单、一对一消息、多方通讯消息、通知、服务发现、能力广告、结构化数据表单、工作流管理、对等网络媒体会话。

1XMPP 的 client-server 架构

XMPP,在本质上,是一种XML流技术。当你准备开始和XMPP服务器会话,你打开一个长时间在线的TCP连接,然后和服务器协商一个XML流(服务器也同样也打开一个流,例如在每个方向有一个流)。
一旦你和你的服务器建立了一个XML流,你和你的服务器可以通过流交换三个特别的XML片段: < message/>、< presence/>、和< iq/>。这些片段,称为XML节(XML stanzas),是XMPP中有意义的基本单元,而且一旦你已建立一个XML流,你可以通过流发送无限数量的节。

一个节可以被认为是通讯的基本单位,类似于一个数据包或在其他网络协议的消息。

XML 流 例子:

C: <stream:stream>

C: <presence/>

C: <iq type="get">

<query xmlns="jabber:iq:roster"/>

</iq>

S: <iq type="result">

<query xmlns="jabber:iq:roster">

<item jid="suke@skh.whu.edu.cn/>

<item jid="gmz@skh.whu.edu.cn"/>

<item jid="beta@skh.whu.edu.cn"/>

</query>

</iq>

C: <message from="suke@skh.whu.edu.cn"

to="beta@skh.whu.edu.cn">

<body>Off with his head!</body>

</message>

S: <message from="lj@skh.whu.edu.cn"

to="cyl@skh.whu.edu.cn ">

<body>You are all pardoned.</body></message>

C: <presence type="unavailable"/>

C: </stream:stream>

  • XMPP的实现

服务端:djabberd、ejabberd、jabberd、jabberd2、Prosody、Tigase等。

openfire

是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。 Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器可支持上万并发用户。

客户端(桌面版):Coccinella、Jeti、Psi、Swift、Tkabber等(类似于rtx、qq、tim、微信

Spark

Spark 是一个面向商业的客户端,并和 Openfire 服务器紧密关联。除了和 Openfire 服务器 的 集 成 外 , 它 也 提 供 了 半 专 有 的 音 频 和 视 频 通 讯 能 力 。 许 可 证 : LGPL 。 网 址 :http://www.igniterealtime.org/projects/spark/。

客户端(web):Jabbear、JWChat、SparkWeb等(类似于wechat网页版)

工具库:

Smack(java)

Smack 是一个非常流行、全功能的库,用于编写客户端、机器人和其他的应用程序。它

由创建了 Openfire 服务器和 Spark 客户端的开发者编写。许可证: Apache。网址:

http://www.igniterealtime .org/projects/smack/。

Strophe(JavaScript)

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

<messageCenter>    --消息中心

<infoId>5376228f-abca-4353-ae00-e4042f96903a</infoId>    --消息主体id

<type>1</type>    --消息类型

<url>/</url>    --附加属性

<appSn>xfgl</appSn>    --消息来源应用标识

</messageCenter>

simba-component-xmpp关键代码:

创建链接

发送消息

消息提醒:消息接收者的web界面右下角出现窗口提醒消息。

Strophe.js关键代码:

添加消息监听处理器

connection.addHandler(function(message));

登录认证

connection.connect(jid, pwd, function(status));

阅读消息:用户点击消息。

更新消息状态:更新状态位。

其他处理:可选。可根据不同的消息类型,进行不同的处理。如通知服务调用者当前消息已阅读。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值