Android基于xmpp的即时通讯应用
xmpp是一个通信协议。因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议。Android上最常用的组合asmack +openfire。Asmack是smack的android版,是对xmpp协议进行了封装,并提供了丰富的api,简化了操作。Openfire是一个开源的IM服务器,基于Xmpp实现。换句话说使用xmpp开发即时通讯应用的话,服务器端已经开发好了,就是openfire。
现在我做的一个android应用就是采用asmack+openfire。说实在的,xmpp协议太多了,大多都是英文的,去学这个东西成本高,但是如果不学,仅仅依赖openfire+asmack提供的功能很难满足多样性的需求。Openfire因为是开源的,所以可以进行插件开发或者二次开发去满足自己业务需求。xmpp还增加了Jingle扩展协议来支持面向连接的业务,如语音和视频。
之前业界xmpp最典型的例子就是Google talk,而且之前Google一直力推xmpp协议。但是Google最新的IM软件Hangouts并没有采用xmpp协议,对这一做法Google也没有一个明确的回答。Google这一做法的确降低的xmpp的热度。另外很多人说xmpp传输效率低,xmpp使用xml格式数据进行通信,过多的标签的确可能降低传输效率。再说现在的国内主流的IM软件,QQ,微信等,都是采用自己私有的通信协议。Openfire采用的TCP连接,QQ采用TCP+UDP。
是开发自己的协议,是使用xmpp协议,还是用封装好的xmpp协议(smack)+现成的服务器(openfire)就是大家的决定了。不过要说的是三种方案灵活性依次降低,成本也依次降低。我们项目的预算比较低所以采用了asmack+openfire。不过这里我要说的是仅仅依赖asmack+openfire是满足不了常规的业务需求的。所以我们的项目引入了webservice,同时尝试对openfire进行插件开发。
这里我可以说说asmack+openfire开发遇到的一些无力的地方,比如:
用户无法接受离线的图片,语音。
群成员在离线后就会离开群(细来说,smack没有群的概念,只有个聊天室)
群聊里没有办法发图片(点对点的时候发送图片使用的是文件传输,只能一对一,不能一对多)
其他的问题就不在细说。对于上述的问题会在后续的文章中分享自己的解决方案。
Xmpp最大的优势是什么,在我看来就是开源。这种开源可以让任意两个使用xmpp协议的软件进行通信。
开发之前有必要了解一些xmpp的一些数据结构。Xmpp连接使用xml流,这个XML流相当于一个会话期间所有XML节的一个信封
|--------------------|
| <stream> |
|--------------------|
| <presence> |
| <show/> |
| </presence> |
|--------------------|
| <message to='foo'> |
| <body/> |
| </message> |
|--------------------|
| <iq to='bar'> |
| <query/> |
| </iq> |
|--------------------|
| ... |
|--------------------|
| </stream> |
|--------------------|
上图中的几个节点 presence、message、IQ对应着asmack的3个对象。这些都是packet的子类。
关于asmack的api,没有找到单独的asmack api,更没有中文的。大家可以再下载jar包的同时选择下载源码。Eclipse引用源码后,通过javadoc就可以看到接口说明了,和api无异。
asmack官网:https://github.com/Flowdalic/asmack
asmack下载地址:http://asmack.freakempire.de/
openfire下载地址:http://www.igniterealtime.org/downloads/index.jsp
smack使用指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html
更新2015-3-12
现在smack(4.1以上版本)已经可以直接跑在Android平台上了,以后asmack也没有更新的必要了。这次smack做了针对Android平台做了很多的优化,也是smack一次里程碑式的更新。
此外设计方案上用openfire+smack+webservice 也许是更优秀的方案。也就是说 只使用smack的通讯功能,诸如好友关系,用户资料这些东西都交给webservice去管理维护。
Smack参考:https://community.igniterealtime.org/blogs/ignite/2015/01/14/smack-410-beta1-available
Android基于xmpp的即时通讯应用的更多相关文章
- Android基于XMPP的即时通讯3-表情发送
这篇博文主要讲表情发送的一些东西. 参考:Android基于XMPP的即时通讯1-基本对话 1.准备好资源文件 采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs ...
- Android基于XMPP的即时通讯2-文件传输
本文是在上一篇博文Android基于XMPP的即时通讯1-基本对话的基础上,添加新的功能,文件传输 1.初始化文件传输管理类 public static FileTransferManager get ...
- Android基于XMPP的即时通讯1-基本对话
闲暇之余,自己写了个简单的即时通讯,基于OpenFire服务器平台. 整个项目包括两个部分,一个是服务器端,一个是android手机端: 一.关于服务器端没什么好说的,下载安装配置即可 推荐下载带ja ...
- 【XMPP】基于XMPP的即时通讯解决方案
什么是XMPP 介绍XMPP之前,先来看看GTalk. GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN. 从技术角度来说,GTalk与QQ和 ...
- iOS基于XMPP实现即时通讯之一、环境的搭建
移动端访问不佳,请访问我的个人博客 使用XMPP已经有一段时间了,但是一直都没深入研究过,只是使用SDK做一些简单的操作,看了许多大神的博客,自己总结一下,准备写一系列关于XMPP的使用博客,以便于自 ...
- Android基于XMPP Smack openfire 开发的聊天室
Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...
- android环境下的即时通讯
首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...
- 基于openfire+smack即时通讯instant message开发
前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...
- [Python]实现XMPP协议即时通讯发送消息功能
#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...
随机推荐
- Win7+MSVC2010+PCL1.7.2
我的配置环境是Win7+MSVC2010+PCL1.7.2. 网上关于点云库配置的文章已经很多,这里不做过多的重复,这里只讲一下自己在配置过程中遇到的问题及一些注意事项. K1: 在用Cmake编译时 ...
- 二分法查找 js 算法
二分法查找算法:采用二分法查找时,数据需是排好序的.主要思想是:(设查找的数组区间为array[s, e])(1)确定该区间的中间位置m(2)将查找的值T与array[m]比较,若相等,查找成功返回此 ...
- 实现人脸识别性别之路---matplotlib之注释
一.准备数据 利用np.linspace()函数得到一定范围内的数据集 利用2*x+1的公式求出y 二.创建窗口 三.根据具有规律的数据画图 四.调整坐标轴 1.将原本的坐标轴的上轴和右轴去掉,使用基 ...
- 紫书 习题 10-21 UVa 1649 (组合数)
C(n, k) = m, 固定k,枚举k 这里用到了组合数的一个性质 当k固定的时候,C(2 * k, k) 最小 C(m, k)最大(对于这道题而言是这样,因为大于m 就最终答案不可能为m了) 所以 ...
- 编程里的API是什么意思?
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码 ...
- 洛谷 P1900 自我数
P1900 自我数 题目描述 在1949年印度数学家D. R. Daprekar发现了一类称作Self-Numbers的数.对于每一个正整数n,我们定义d(n)为n加上它每一位数字的和.例如,d(75 ...
- 【shell学习】经常使用条件推断-字符,数字,文件
IF 推断 之前也写过简单的shell脚本,也不是转职运维.和系统相关的工作比較少.所以不怎么熟练. 近期因为系统总是出现各种乱七八糟的问题,也没有人来协助.仅仅好自己写shell脚本了,都是些基础的 ...
- iOS Core Animation具体解释(四)AutoLayout中的动画
原创blog.转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...
- 使用Java语言开发微信公众平台(五)——被关注回复与关键词回复
在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信 ...
- AIX查看HBA卡的WWN号
1,获得AIX主机连接的光纤设备: # lsdev -Cc adapter -S a | grep fcs fcs0 Available 09-08 FC Ad ...