在Openfire上弄一个简单的推送系统
来源:互联网 发布:淘宝立体服装拍摄姿势 编辑:程序博客网 时间:2024/04/30 03:55
在Openfire上弄一个简单的推送系统
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
推送系统
说是推送系统有点大,其实就是一个消息广播功能吧。作用其实也就是由服务端接收到消息然后推送到订阅的客户端。
思路
对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息。这样的好处就是有消息后才向客户端推送,相比于拉取数据不会产生许多无效的查询,实时性也高。
xmpp这种即时通信协议基于TCP长连接还是比较符合这种场景的。只需要在服务端增加一个模块用于接收用户订阅与数据的推送就完成了主体功能。
在xmpp协议里可以扩展组件,这样我们写一个组件,然后连接到xmpp服务器,这样就可以应用于不同的xmpp服务器。
准备工作
主要的环境
因为我比较熟悉openfire的体系,所以自然就用它。客户端暂时没有特别的需求,只是用于接收数据,所以用smack或者任何一款xmpp 客户端都可以。我为了简单就用smack写一个简单的代码。
需要用到的jar包
用到的了whack的core,在maven工程里直接引用即可,相关的依赖包会自动加载进来
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
核心模块
推送服务
推送服务就是等待或者获得需要推送的消息数据后向用户广播出去的服务。因为这里暂时没有设定数据的场景,所以就简单的用一个阻塞队列来表示。步骤:
1. 数据通过推送接口写入到推送服务
2. 推送服务将数据写入到消息队列
3. 发送线程检测到消息后取出并发给订阅的客户端
在此我写了一个PushServer的类用于表示推送服务,这个类里包含了:
1. 一个消息队列
2. 一个发送线程
3. 一个订阅列表
4. 以及一些发送相关的xmpp组件
消息队列
- 1
- 2
- 1
- 2
使用到了生产者消费者模式,所以用了一个阻塞队列,用于存放等待发送的消息数据。
发送线程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
这个线程继承了Thread,线程的功能很简单,就是一直从queue中获得消息,因为是阻塞的队列,所以没有消息时会阻塞,一旦有消息就会执行发送sendPacket将包发送出去。
这里使用到了componentManager,这个是openfire实现的一个组件管理类,通过这个类的对象可以发送xmpp数据包。
增加shutdown方法,使得线程可以在外部进行退出操作。
订阅列表
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
只有订阅了这个推送服务的客户端才会进行推送操作,这里的代码就是用于订阅与退订操作。用了一个HashSet来存储。
xmpp组件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
这里的PushComponent就是一个xmpp组件,相当于一个扩展模块,可以接收消息并处理消息,也就是自己写一些和xmpp相关的业务功能。
PushManager就是管理组件并连接到xmpp服务器的一个类。
服务端启动
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
这段代码模拟了服务的启动,同时为了简化功能这里直接添加了一个订阅用户。
客户端
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
客户端代码启动一个xmpp连接,然后登录到服务器,同时订阅消息,将收到的消息print出来。
整个过程就完成了。
注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!
http://blog.csdn.net/5207
- 在Openfire上弄一个简单的推送系统
- 在Openfire上弄一个简单的推送系统
- 在Openfire上弄一个简单的推送系统
- 不在appIcon上显示推送数量,但是在系统通知栏保留推送通知的方法
- 不在appIcon上显示推送数量,但是在系统通知栏保留推送通知的方法
- openfire 服务器在Linux上的安装
- Openfire在Ubuntu上的搭建
- 一个简单的极光推送
- 一个简单的openfire+smack的学习分享
- 实现一个简单的服务端推送方案
- 解决在centos x64 上安装openfire出现的错误
- 在Eclipse上建立Openfire工程的过程
- openfire在win8电脑上安装的问题
- 基于openfire实现的androidpn的推送
- openfire推送离线聊天信息的插件
- 一个运行在Web服务器上的远程管理简单例子
- 在spark上实现了一个简单的功能
- 在VMware上制作一个简单的Linux
- Connect the Cities 【最小生成树】
- python 连接数据库
- 深度学习笔记——理论与推导之RNN的训练过程BPTT(五)
- MyApplication.java9
- POJ总结(1035)-Java
- 在Openfire上弄一个简单的推送系统
- java-重写/重载
- POJ 2411 Mondriaan's Dream(插头DP,轮廓线)
- 搭建项目,并与Gitlab构建连接的方法
- 紧张是意外发生的导火索
- Android笔记(16)retrofit上传图片
- Spring_001 安装spring在Eclipse的插件Spring Tool Suite™z指南
- json循环put数据
- Ubuntu14.04安装OpenCV3.0