Android中开发IM即时通讯功能的方案

Stella981
• 阅读 561

这里有必要普及一下xmpp是个什么东西?

引用某娘的定义:

      XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。

网络结构:

      XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSNICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。

功能:

      传输的是与即时通讯相关的指令。在以前这些命令要么用2进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换行符的方式发送(比如MSN)。而XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。

一句话总结就是一个可以用于IM功能的协议,传输的是xml数据

移动端IM大概有以下这些方案,但不仅于这些

1.第三方平台

比如环信,融云,leancloud,容联云等等。直接使用sdk就可以实现了,最简单最直接,而且稳定性已经不错了,连UI界面都带有了,可以自行修改,缺点是要收费,比如环信日活跃用户30万以上开始收费,融云基础功能不收费,VIP级别的功能要收费。如果让我选应该会在环信和融云之间选,环信的话一个是市场占有率比较大,二个是技术客服基本都能找到在线的,融云客服的话需要像写邮件一样找技术解决问题,不是在线的交流,我觉得挺不好的,融云的demo倒是做得比环信好看,环信的看上去很粗糙的感觉。据使用过的朋友反馈融云sdk比较好接入,环信稍微麻烦点,使用的时候都会有一些坑的地方要处理。

2.Spark+smack+openfire套餐

安卓使用asmack,测试使用spark,服务器使用openfire。asmack可以说是smack的Android平台的支持版提供xmpp协议的实现,就是一些个api,spark就是一个可以用来在pc相互同信的客户端,openfire部署也比较简单,next,next就差不多了。这套方案还算比较成熟的了,当然没有第三方的方便,工作量也增多了,这套也是基于xmpp协议同时也就有xmpp协议的一些缺点。

3.使用第三方推送的sdk

利用推送的及时性来做im也是可以的,推送也不收费吧。

4.Socket长链接

socket大家都懂了的,感觉做个小东西还可以,但是正真商用要做的处理还是挺多的,网络优化,稳定性等等。

5.基于xmpp自己做

xmpp协议本来就是可以坐im功能的,据了解环信就是自己基于xmpp来做的,50人上下的团队14年开始做的,现在两年左右已经融了两三轮资了。不过xmpp基于xml,冗长直接导致费流量费电,特别是移动端,可以考虑在传输的时候自己加一层二进制协议,如果环信真是xmpp来做应该也会在这方面做优化的。还有mqtt,sip等协议也是可以自己做。如果im不是核心功能不推荐自己做,费时费力。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这