默认
打赏 发表评论 25
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
即时通讯框架MobileIMSDK:常见问题解答
微信扫一扫关注! 其它资料链接请回到详细介绍页↘http://www.52im.net/thread-52-1-1.html

捐助作者,得MobileIMSDK精编注释版


点击以下链接,前往淘宝下单,付款后发货到您的指定邮箱:


即时通讯框架MobileIMSDK:常见问题解答_all-in-one.png

(更多详情请进入:http://www.52im.net/thread-411-1-1.html

问题1:MobileIMSDK到底是什么?有何价值?解决了哪些问题?


到底是什么?
纯技术角度讲:它是一整套基于UDP/TCP协议的客户端A、服务端、客户端B的3方全向即时通讯算法实现,超轻量级、高度提炼。
应用层角度讲:它是一组包含了Android客户端库、iOS客户端库、Java跨平台客户端库和服务端库的即时通讯SDK框架集。
更通俗一点讲:它是一个专为移动设备设计的跨设备、跨平台、跨网络的即时通讯开发框架,可用于(包含但不限于)开发聊天APP、企业OA、消息推送应用等。

  有何价值?
有过即时通讯应用开发经验的人都有体会,即时通讯应用开发的难点不仅在于应用层的业务逻辑实现,更重的要是需要稳定、可靠、对应用层友好的即时通讯核心层框架,否则应用层的复杂逻辑再掺杂进即时通讯通信技术本身的复杂性(在无线网络普及的时代,问题更为突出),会让经验不足的开发团队陷入混乱。MobileIMSDK的价值在于:让开发者专注于应用逻辑的开发,底层复杂的即时通讯算法交由SDK开发人员,从而解偶即时通讯应用开发的复杂性

  解决了哪些问题?

  • UDP/TCP协议实现,更符合现今的复杂移动端网络通信环境;
  • 完善的QoS消息送达保证机制,解决了UDP通信时的消息黑洞问题;
  • 解决了高延迟网络环境下的2G、3G、4G、WiFi以及传统宽带的多端、多网混合通信可靠性和稳定性问题;
  • 拥有通信自动治愈算法,无论无线信号多么恶劣,只要恢复通信,将自动实现连接自我修复;
  • 预定义多种耗电模式,在应对不同通信场景的情况下,自主决定电量、网络流量的消耗等;
  • 易拆装的协议封装,可针对不同应用场景,选择适合的协议压缩方案;
  • 历经多个版本的锤炼,API高度封装,在解决应用层与即时通讯层代码偶合的同时,能适应更多应用场景。

有关MobileIMSDK的更多介绍,请见《即时通讯框架MobileIMSDK:快速入门》。

问题2:类似于MobileIMSDK的框架好开发吗,有何难度?

老实讲,想要开发出稳定可靠且可用于生产环境的完整算法,并不容易,比较明显的难点如下所述。


难点算法偶合性大、整合有难度
算法本身并无开创性,但杂合无线网络的复杂性(不同制式、易受干扰等)、跨设备、跨平台、跨网络类型的混合通信, 这些要素和条件下,要实现的算法偶合性较大,加大了整合的难度。

难点算法需多平台无差别精确实现、人员配备省不了
因需要支持不同平台、多种要素和条件,要实现的算法不可谓不吹毛求疵,要求不算太高,但显然没有些许功底是不太容易搞定的,所以人员配备是个问题。

难点框架的提炼和把握需精准、对上层友好是关键
能较高质量地实现所谓“框架”的价值已然超越了算法本身,否则再牛逼的东西也只能孤芳自赏,所以对上层友好也很关键,简单的代码堆砌显然不可能达到目的。

难点④:时间上很难一蹴而就
在众多要素和条件存在的前提下,未经长期的测试和针对性调优,很难满足实际应用的品质要求,时间上也是省不了的。

问题3:使用MobileIMSDK时如何获得帮助?


问题4:MobileIMSDK定义了具体的聊天APP协议吗?


没有。MobileIMSDK有明确的设计目标:即实现一个“专为移动端开发,可应用于跨设备的聊天APP、企业OA、消息推送等各种场景的高可重用即时通讯框架。”,所以为了提升MobileIMSDK的可重用性和灵活性,设计之初就特别回避了这一点。

这么设计带来的好处是,比如当MobileIMSDK应用于企业OA时,因传统企业应用系统中,通常都有自已的用户关系管理模型和实现,因而只需要将MobileIMSDK作为即时通讯消息路由子系统来使用即可,这样的场景下事情本来就该这么简单。

当然,您可以自已定义您的聊天APP协议细节,这也意味着您在开发时能拥有更高的灵活性。一个典型的基于MobileIMSDK的全功能聊天应用APP案例:点此查看和试用

基于MobileIMSDK来开发更多IM等具体的业务逻辑,请见以下讨论贴:
[已回复] 关于如何MobileIMSDK的Server端实现群组功能?
[已回复] MobileIMSDK的群聊、语音、视频、文件传输考虑加这些功能么?
[已回复] 请教基于MobileIMSDK的群聊该如何实现?
[已回复] 用MobileIMSDK怎么实现群聊天
[已回复] MobileIMSDK实现讨论组或者群聊的思路如何实现?
[已回复] 请教MobileIMSDK一对多群发、一对一单发消息的实现
[已回复] MobileIMSDK v3.0 的Web版与APP版群聊的问题
[已回复] MobileIMSDK服务端的多设备登陆互踢问题求助
[已解决] MobileIMSDK 退出登录后再重新登录的问题
[已解决] 基于MobileIMSDK写IM之添加好友功能实现的疑问
[已回复] MobileIMSDK开发音视频即时通讯、图片消息的疑问
[已回复] MobileIMSDK如何实现图片、语音留言信息的发送?
[已回复] MobileIMSDK里未读消息、已读消息的显示如何实现?
>> 更多讨论贴点此进入...

问题5:MobileIMSDK为何是基于UDP协议实现?有何好处?


特别补充:MobileIMSDK v5已支持TCP协议,感兴趣可以请往下载最新版本:https://github.com/JackJiang2011/MobileIMSDK

众所周之,因为UDP协议的无连接特性,比较明显的好处有以下两点。

好处同等服务器软硬件条件下的更高效费比
相比TCP协议,因独有的UDP协议无连接特性,可灵活调整即时通讯算法,从而达成在有限的软硬件条件下能支持更多的同时在线数。

好处非常适合于网络延迟较大、网络环境复杂的场景
某款基于MobileIMSDK的应用(点此查看它的非敏感运营数据)曾运营于高延迟、复杂的跨国、跨洲际网络环境下(统计表明,此应用的典型网络环境里访问一个http应用的单向网络平均延迟高达300ms以上,而同时段访问国内的主流门户延迟约为30ms左右),应用仍能正常保持较好的用户体验。这也一定程度证明了MobileIMSDK在此场景下的稳定性和可靠性。但假设此种情况下使用TCP协议,则协议层丢包和重传情况会非常多,根据TCP协议的重传算法指数退避原则,在某些情况下,因此而带来的用户体验灾难是无法控制的。

相关文章仅供参考:


问题6:MobileIMSDK支持集群吗?


MobileIMSDK暂不支持集群(后绪版本有支持集群的计划)。理论上,MobileIMSDK应用于聊天APP时单机可负载的同时在线数可数十万,应用于推送场景下可达千万级别,如果您的应用能达到这样的负载极限,总用户数至少是百万甚至千万级别,相信一切技术问题都不再会是问题了。无论如何,任何同类技术的单机容量都会有颈,为了更高的负载和更好的伸缩性,大型应用里集群当然是必须的选择。MobileIMSDK的压力测试报告:点此查看

MobileIMSDK已有集群开发计划,未来版本中会加入。

问题7:MobileIMSDK支持TCP协议吗?


MobileIMSDK v5已支持TCP协议,感兴趣可以请往下载最新版本:https://github.com/JackJiang2011/MobileIMSDK

问题8:MobileIMSDK支持同一用户名的多设备登陆吗?


理论上MobileIMSDK的通讯不依赖于用户名(服务端会为每一个登陆的客户端分配一个唯一ID),因而同一用户名在不同客户端登陆时,通讯不受影响,但具体实现还依赖于应用层是如果处理的。

相关讨论帖子请见:
[已回复] MobileIMSDK 3.0版 同一账号多处登录,业务逻辑如何处理?
[已回复] MobileIMSDK服务端的多设备登陆互踢问题求助
>> 更多讨论贴点此进入...

问题9:客户端后台有心跳机制吗?为何需要心跳机制?


MobileIMSDK的客户端后台有健壮的心跳机制,使用心跳机制的主要目的有3个。

目的刷新NAT路由的UDP端口老化时间
典型情况下厂商的NAT路由算法中UDP的端口老化时间约为300秒(当然,具体数值由无线ISP或您的家用路由器厂商定义,很多情况下此时间可能会更短),如果没有心跳机制,则您的客户端将会因UDP端口老化而再也收不到消息。这显然不是MobileIMSDK的问题,它是由网关设备的NAT路由算法所决定。

目的告诉服务端您的客户端还“活着”
因为UDP的无连接特性,心跳机制对于刷新服务端的在线列表是直接而有效的方案。

目的让客户端知道自已是否还处于“正常通信”状态
导致客户端与服务端无法通信的因素有很多,很难用有限且简单的代码来判断之。举个例子:当您的手机正常连接于您的家庭WiFi时,WiFi连接是正常的,但此时您的宽带由于欠费或其它原因根本就无法上网,此时如果没有心跳机制,您的APP会认为网络正常,但却无法完成数据的收发,因为根本就上不了网。

相关技术文章请见:
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
为何基于TCP协议的移动端IM仍然需要心跳保活机制?
移动端IM实践:实现Android版微信的智能心跳机制
移动端IM实践:WhatsApp、Line、微信的心跳策略分析
>> 更多同类文章 ……

问题10:MobileIMSDK如何支持手机号、账号等多种登陆方式?


请见讨论贴《[已回复] 对接MobileIMSDK的登录逻辑问题,如果同时手机号和账号登录?》。

问题11:MobileIMSDK客户端退出登陆(或切换账号)后无法再次登陆?


请见讨论贴《[已解决] MobileIMSDK的安卓版退出后(不退出APP)无法再次登录的问题》,及贴内回复内容。

问题12:MobileIMSDK服务端如何主动推送给客户端?


请见讨论贴《[已解决] MobileIMSDK服务端主动推送消息至Android客户端该怎么实现?》,及贴内回复内容。

问题13:MobileIMSDK服务端内网运行正常,但部署到外网后无法连接?


请见讨论贴:
[已解决] MobileIMSDK服务端部署在阿里云上客户端连接不成功的问题
[已回复] 公网上的Windows 2008部署MobileIMSDK后客户端不能连接
及贴内回复内容。

问题14:MobileIMSDK有消息最大字节数限制?


特别补充:MobileIMSDK v5已支持TCP协议,感兴趣可以请往下载最新版本:https://github.com/JackJiang2011/MobileIMSDK,TCP协议版将支持高达2的32次方个字节的大文本内容传输。

MobileIMSDK是基于UDP实现的,因为UDP是基于“包”的概念,所以长度肯定不是无限的。

具体的理论,你可以参考以下两篇文章:
UDP中一个包的大小最大能多大
不为人知的网络编程(六):深入地理解UDP协议并用好它

如果你考虑到的是你的移动端IM里要发送大文本的情况,你可以看看这个帖子里的讨论:
[已回复] MobileIMSDK的消息有大小限制吗?

问题15:MobileIMSDK服务端如何部署?


请见开发者文档《即时通讯框架MobileIMSDK的Demo使用帮助:Server端》。

问题16:MobileIMSDK的v2和v3有什么致命区别?


请见讨论贴《[已回复] MobileIMSDK的v2和v3有什么致命区别?客户端可以不修改直接从v2升级到v3吗?》,及贴内回复内容。

问题17:MobileIMSDK中如何处理离线消息?


请见讨论贴《[已回复] 求教MobileIMSDK中IM离线消息处理方法》,及贴内回复内容。

问题18:MobileIMSDK服务端onTransBuffer回调具体都怎么用?


请见讨论贴《[已解决] MobileIMSDK服务端onTransBuffer回调具体都怎么用?》,及贴内回复内容。

问题19:MobileIMSDK中UDP是如何保证消息不丢失?


请见以下讨论贴及贴内回复内容:
[已解决] MobileIMSDK中的心跳发起顺序和送达保证机制
[已回复] 关于MobileIMSDK中UDP如何保证消息不丢失问题

问题20:MobileIMSDK 淘宝下单精编版本后,以后怎么获取更新?


请见讨论贴《[已回复] MobileIMSDK 商业版本怎么获取更新?》,及贴内回复内容。

问题21:MobileIMSDK如何实现踢掉一个登录用户?


请见讨论贴《[已回复] 请问MobileIMSDK如何踢掉一个登录用户》,及贴内回复内容。

问题22:如何将MobileIMSDK集成到web项目里?


请见讨论贴《[已解决] 请教如何将MobileIMSDK集成到web项目里,作为服务器使用?》,及贴内回复内容。

问题23:MobileIMSDK有Web版吗?


MobileIMSDK的Web版已独立为MobileIMSDK-Web工程,且2者协议完全兼容,可无缝互通,详见:《轻量级Web端即时通讯框架:MobileIMSDK-Web基本介绍》。

问题24:如何使用MobileIMSDK开发消息推送系统?


请见讨论贴《[已回复] 如何使用MobileIMSDK开发消息推送系统?》,及贴内回复内容。

问题25:MobileIMSDK中的AppKey有何作用?需要获取AppKey?


请见讨论贴《[已解决] 请问下MobileIMSDK服务端的appKey是怎么获取的?》,及贴内回复内容。

问题26:MobileIMSDK的udp压力测试无法达到单机上限的问题?


请见讨论贴《[已解决] MobileIMSDK的udp压力测试无法达到单机上限的问题》,及贴内回复内容。

问题27:MobileIMSDK与其他推送框架的互通问题?


请见讨论贴《[已回复] 关于MobileIMSDK与其他推送框架的互通问题》,及贴内回复内容。

问题28:MobileIMSDK支持Netty版吗?


MobileIMSDK 以在v3.1版中提供了基于Netty的MobileIMSDK服务端库,Netty首版发布于2017年12月14日。
您可前往Github下载最新版:https://github.com/JackJiang2011/MobileIMSDK

附录:更多MobileIMSDK常见问题讨论帖


请见:http://www.52im.net/forum.php?mod=collection&action=view&ctid=2

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:即时通讯框架MobileIMSDK的开发指南:Java客户端下一篇:即时通讯框架MobileIMSDK的开发指南:Android客户端

本帖已收录至以下技术专辑

推荐方案
评论 25
请问是否支持wbe通信?
引用:lixiang1987 发表于 2016-07-04 22:30
请问是否支持wbe通信?

你说的是“是否支持Web端吧”?
目前MobileIMSDK不支持Web端,自已去写的话也不是难事,再说MobileIMSDK这种c/s技术框架跟Web版即时通讯本来就是分开的两码事呢,你可以独立写好后建立桥接通信就可以互联了。
请问有没有MobileIMSDK架构的介绍?
安卓心跳包中,30s以上就频繁断开,10s会偶尔断开,3s就比较稳定了。但是根据楼主所说,不是说NAT表的清除时间有的都到好几分钟吗,为什么安卓10s就很容易断开连接呢?还要就是3s的心跳时间,会不会有点太频繁了,这样手机电量消耗会很大吧?
引用:jituijiaqiezi 发表于 2017-04-06 18:12
安卓心跳包中,30s以上就频繁断开,10s会偶尔断开,3s就比较稳定了。但是根据楼主所说,不是说NAT表的清除 ...

NAT路由端口老化是程序无法解决的,能解决的就是减小流量消耗以及其它策略
在源码中的安卓库中,ClientCoreSDK中的检测网路的广播接受器networkConnectionStatusBroadcastReceiver中,当检测到网络已连接上时,调用的应该是LocalUDPSocketProvider.resetLocalUDPSocket而不是closeLocalUDPSocket吧?
引用:jituijiaqiezi 发表于 2017-04-10 11:29
在源码中的安卓库中,ClientCoreSDK中的检测网路的广播接受器networkConnectionStatusBroadcastReceiver中 ...

理论上,调这两个方法中的任一个都可以,你理解下代码就明白了,关键是只要getLocalUDPSocket()能拿到干净的socket就行了。
引用:JackJiang 发表于 2017-04-10 12:49
理论上,调这两个方法中的任一个都可以,你理解下代码就明白了,关键是只要getLocalUDPSocket()能拿到干 ...

懂了,谢谢
想问问楼主对于推送和即时通信有什么区别呢?我怎么感觉都是维持长连接进行消息的发送呢?
引用:jituijiaqiezi 发表于 2017-04-10 17:04
想问问楼主对于推送和即时通信有什么区别呢?我怎么感觉都是维持长连接进行消息的发送呢?

本来就是啊
引用:JackJiang 发表于 2017-04-10 19:41
本来就是啊

这样啊,应该没有应用是自己本身有了即时通讯,又去搞一个推送的吧
引用:jituijiaqiezi 发表于 2017-04-10 20:14
这样啊,应该没有应用是自己本身有了即时通讯,又去搞一个推送的吧

没有那必要
引用:JackJiang 发表于 2017-04-10 20:15
没有那必要

好的,3q
    请问mobileIMSDK中的心跳机制是采用哪种方式?是客户端定时请求的方式吗?
引用:fuzhongwangcs 发表于 2017-07-26 14:07
请问mobileIMSDK中的心跳机制是采用哪种方式?是客户端定时请求的方式吗?

你看看这个帖子能否解决你的疑问:http://www.52im.net/thread-129-1-1.html
3Q
签名: 心情好
现在支持集群吗?我看之前有个评论说有计划支持集群。如果没有今年有计划加上集群的支持吗?
您好, iOS端的MobileIMSDKDemo是基于Socket和服务器建立连接传输消息吗? 那么这个服务器是您自己搭建在公网上的吗?
引用:ClayQAQ 发表于 2023-04-05 17:34
您好, iOS端的MobileIMSDKDemo是基于Socket和服务器建立连接传输消息吗? 那么这个服务器是您自己搭建在公 ...

1、是的,基于tcp或udp的socket长连接通信。
2、你应该自已搭建服务端,我提供的仅用于测试和演示而已。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部