默认
打赏 发表评论 252
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
新手入门一篇就够:从零开发移动端IM
阅读(1659235) | 评论(252 收藏306 淘帖1 68
微信扫一扫关注!

一、前言


IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和交流门槛,对各种应用形态产生了深远影响。

做为IM开发者或即将成为IM开发者的技术人员,IM的价值和重要性不言自明。但从技术实现来说,IM系统的开发(尤其是移动端IM)还是存在许多技术难点和坑点的。也正因如此,优质的IM开发资料、实践成果,对于没有太多技术储备的新手来说,尤其难以获得。

本文将以新手的视角引导你阅读相关文章,便于你从零开发一个移动端IM做好方方面面的知识准备:包括但不限于网络编程基础、通信协议的选型、IM的架构设计等等。文笔有限,如有不妥之处还请批评指正,希望对你有用。

* 阅读对象:本文适合想从技术维度系统学习IM技术并着手自已开发(即解决“IM系统要怎么做?”这个疑问)的技术人员阅读。如果你是产品经理或技术小白,只是想知道“IM系统是什么?”,不想深入探讨具体的技术实现,可以阅读:《零基础IM开发入门》系列文章。

另外:如果你是老司机,或觉得本文内容过于庞大,可自行前往即时通讯网收纳整理的技术专辑,选择性地阅读:点击进入技术分类和专辑

* 特别推荐:建议读完本文后,继续阅读本站的几篇实战性即时通讯入门文章《自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)》、《适合新手:从零开发一个IM服务端(基于Netty,有完整源码)》、《拿起键盘就是干:跟我一起徒手开发一套分布式IM系统》,效果更好。

* 最新修改1:  2020年05月18日,新增加了“《IM开发宝典:史上最全,微信各种功能参数和逻辑规则资料汇总》”链接。
* 最新修改2:  2020年08月03日,新增加了“《Web端即时通讯实践干货:如何让你的WebSocket断网重连更快速?》”链接。
* 最新修改3:  2020年08月10日,新增加了“《脑残式网络编程入门(九):面试必考,史上最通俗大小端字节序详解》”链接。
* 最新修改4:  2020年08月31日,新增加了“《IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)》”链接。
* 最新修改5:  2021年03月22日,新增加了“《一套亿级用户的IM架构技术干货》”链接。
* 最新修改6:  2021年04月05日,新增加了“《从新手到专家:如何设计一套亿级消息量的分布式IM系统》”链接。
* 最新修改7:  2021年07月12日,新增加了“《喜马拉雅亿级用户量的离线消息推送系统架构设计实践》”链接。
* 最新修改8:  2021年07月19日,新增加了“《企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等》”链接。
* 最新修改9:  2021年07月26日,新增加了“《融云技术分享:全面揭秘亿级IM消息的可靠投递机制》”链接。
* 最新修改102021年11月07日,新增加了“《大型IM系统有多难?万字长文,搞懂异地多活!》”链接。
* 最新修改112021年12月28日,新增加了“《网络编程懒人入门(十三):一泡尿的时间,快速搞懂TCP和UDP的区别》”链接。
* 最新修改122022年01月18日,新增加了“《跟着源码学IM(十):基于Netty,搭建高性能IM集群(含技术思路+源码)》”链接。
* 最新修改132022年03月28日,新增加了“《网络编程入门从未如此简单(三):什么是IPv6?漫画式图文,一篇即懂!》”链接。
* 最新修改142022年04月18日,新增加了“《IM开发干货分享:浅谈IM系统中离线消息、历史消息的最佳实践》”链接。
* 最新修改152022年08月14日,新增加了“《阿里IM技术分享(八):深度解密钉钉即时消息服务DTIM的技术设计》”链接。
* 最新修改162022年12月11日,新增加了“《基于Netty的IM聊天加密技术学习:一文理清常见的加密概念、术语等》”链接。
* 最新修改172023年02月17日,新增加了“《手把手教你为基于Netty的IM生成自签名SSL/TLS证书》”链接。
* 最新修改182023年03月13日,新增加了“《得物从0到1自研客服IM系统的技术实践之路》”链接。
* 最新修改192023年05月03日,新增加了“《史诗级计算机字符编码知识分享,万字长文,一文即懂!》”链接。
* 最新修改202023年05月22日,新增加了“《揭秘百度IM消息中台的全量用户消息推送技术改造实践》”链接。
* 最新修改212023年05月29日,新增加了“《一套基于Netty的分布式高可用IM详细设计与实现(有源码)》”链接。
* 最新修改222024年10月05日,新增加了“《百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现》”链接。

二、读完本文的收获


2.1您将获得


本文将假设你是毫无技术准备的新手,引导你通过一篇篇精选的文章,了解如何从零开发一个移动端IM所需要的各种技术、资料和实践性代码。

2.2您无法获得


鉴于IM技术的复杂性,IM开发相关的技术不是一篇文章所能展现的完整,限于篇幅原因本文将不包含任何实践性代码、也尽量不对某项技术作深入的展开,相关的实践性代码、资料、技术详解等请依据本文作者准备的文章逐个深入阅读和学习,而这也恰恰是本文想达到的目的。

三、题外话


随着近两年IM云服务的发展,很多团队基于种种原因,直接选择了短平快的云IM接入APP中。然而,考虑到云IM无论从商业模式还是运营模式上,还需经过多年的沉淀,才可能真正实现客户与服务商的运营和服务良性循环的双赢局面。因则,如何选择云IM服务商,这就是个头疼的问题了,不过这不是本文将要讨论的重点,如果需要,你也可以加入本文提到的讨论交流群,与大家一起交流群: 215477170

好了,以下是正文内容。

四、网络编程理论准备


即时通讯技术归根结底还是网络编程技术的应用,如果您很好奇承载这些网络协议的物理设备是怎么工作的,可以先看看《网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门》、《网络编程入门从未如此简单(一):假如你来设计网络,会怎么做?》。

4.1UDP、TCP理论基础


我们都知道,IM系统的业务本质就是客户端与客户端进行消息的实时传递,而技术基础就是基于Socket连接的实时数据读写,那么基本的网络编程理论基础是作为新手的你必须掌握的知识点。当然,作为IM开发来说,基础的网络理论就够用了,也没有必要像网络工程师一样精通所谓的OSI七层参考模型。

如果你还不知道什么是UDP、TCP协议,请阅读以下文章:


这几篇文章有助于对UDP、TCP协议建立基本的认识,当然如果时间允许,能全书阅读网络编程理论经典《TCP/IP详解 卷1:协议》则再好不过了。另外,UDP、TCP作为基础计算机数据传输协议,在其之上衍生了很多应用层协议,相关的协议族关系图可以在此文中找到:《计算机网络通讯协议关系图(中文珍藏版)》,可作为您日常的备查手册使用。

4.2深入理解TCP传输协议


透彻理解TCP传输协议的连接和断开过程非常有助于您日后IM算法的优化和实现,这个过程被形象的总结为“3次握手与4次挥手”。

以下文章有助于您深入理解之:


4.3深入理解UDP传输协议


相比TCP协议,UDP数据传输协议就显得非常轻量和易于理解,UDP通常被用于需要快速响应的数据传输场景下,对应于IM中的应用形态有:P2P通信、实时音视频等。另外,通常的IM都会被应用于互联网上(而非局域网),那么了解所谓的NAT路由技术原理等,也将有助于您对P2P打洞、UDP端口老化等概念有一个清楚的认知。

以下文章有助于您在接下来开发IM的实际应用中提供一定的实践依据:


4.4深入理解基于广域网的互联网编程知识


未来您所编写的网络应用程序或产品基本都要运行基于广域网的互联网中(而非单纯而简单的局域网),而广域网因物理网络的复杂性,要编写能适应各种网络拓扑的程序代码,需要过硬的广域网络基础知识,比如NAT路由转发、P2P打洞等等。

下面的文章,有助于您深入理解NAT原理、点对点通信等方面的知识:


4.5有关高性能网络编程的知识


实际上,大用户量高并发生产环境下的网络编程,你所开发的产品要想真正堪用并非易事,你很有必要了解高性能网络编程领域所关注的热点问题和努力的方向。

以下是即时通讯网整理的高性能网络编程领域的系列文章:


好消息是,现时的网络编程为了解决高性能问题,有很多成型的Socket应用层模式存在,比如:NIO、AIO等,文章《Java新一代网络编程模型AIO原理及Linux系统AIO介绍》简单介绍了传统的阻塞式IO、NIO,并着重介绍了最新的AIO技术,如有时间您很有必要予以了解。(更多同类文章:点此进入…

4.6深入理解移动互联网络的特性


移动互联网络因为无线通信的复杂性:慢、高延迟、易受干扰、带宽窄等特点,使得与传统的有线网络下的应用功能实现有明显差异,您很有必要详细了解一下无线网络方面的特性。

以下文章有助于加深您对移动网络特性的理解:



4.7深入学习通信技术物理层(高阶知识,选读!)


如果学完上述各小节里推荐的网络通信应用层知识,还觉得意犹未尽,那么你肯定是万中无一的人才了——是时候开始《IM开发者的零基础通信技术入门》这个高阶知识系列的学习了。

以下文章为IM/推送技术开发的边界知识,有助于你从物理层理解各种网络问题:


五、网络编程基础实践


如果你认真读完了上一层的文章,是时候写些代码,来理论联系实际理解Socket通信的原理和实践了(动手前,再补读一下《脑残式网络编程入门(九):面试必考,史上最通俗大小端字节序详解)。

有关TCP的Socket通信Demo文章和代码:


当然,以上只是随手找的Demo代码,网络上有关TCP数据通信的演示性代码很容易找到,在此就不过多举例了。

本文作者专门编写的有关跨移动端平台的UDP Socket通信Demo:


另外,在用NIO框架MINA和Netty进行网络编程实践时,即时查阅最新源码和API文档会有很大帮助,以下是即时通讯网独家整理的相关资源。

MINA和Netty框架的最新源码在线阅读:


MINA和Netty框架的最新API文档在线阅读:


六、IM到底该用UDP还是TCP协议?


好了,上面的网络编程基础掌握后,就要开始为你的IM进行传输协议选型了。说到IM该用UDP还是TCP作为传输协议,这是个颇有争议的话题,各大社区每当此问题的出现必定是大片的不同声音。

当然,UDP和TCP各有各的应用场景,作为IM来说,早期的IM因为服务端资源(服务器硬件、网络带宽等)比较昂贵且没有更好的办法来分担性能负载,所以很多时候会考虑使用UDP,这其中主要是早期的QQ为代表。

时至今日,TCP的服务端负载已经有了很好的解决方案,加之服务器资源成本的下降,目前很多IM、消息推送解决方案也都在使用TCP作为传输层协议。不过,UDP也并未排除在IM、消息推送的解决方案之外,比如:弱网络通信(包括跨国的高延迟网络环境)、物联网通信、IM中的实时音视频通信等等场景下,UDP依然是首选项。

以下文章或许有助于您对传输层协议的选型:


当然,关于IM到底该选择UDP还是TCP,这是个仁者见仁智者见智的问题,没有必要过于纠结,请从您的IM整体应用场景、开发代价、部署和运营成本等方面综合考虑,相信能找到你要的答案。

七、IM的数据通信格式选型


IM应用开发的前期技术选型时,关于数据通信格式的选择,在同行的眼里,同样是个极富争议的话题。

精略分析一下,究其原因,大概在于以下几点:

  • 1)可选择的协议或封装格式多种多样:
    可选择的余地大:XMPP、Protobuf、JSON、私有2进制、MQTT、定格化XML、Plain text等等;
  • 2)同一种格式并不能适用于大多数的场景:
    不同场景有同的考虑而协议的选择往往跟这挂钩在一起,如:移动端IM或消息推送的应用场景下如用XMPP协议,多数情况下都会被喷;
  • 3)开发者对所选格式有各自的偏好:
    有的人或团队对某种或某几种格式有不一样的经验和技术积累,也促成了他们对某种或某几种协议的偏好。

该选什么样的数据通信格式,同样是跟你的应用场景和使用的架构方案相关联。不过,目前以作者掌握的信息看来,作为需要运行在移动设备的IM,几乎目前所有主流讨论里都不建议使用XMPP协议,具体原因就不在此展开了,下面推荐的文章里会详细为你解答原因。

以下文章会对你的IM的数据通信格式选型有所帮助:


(更多同类文章:点此查看…

八、移动端IM的心跳保活和后台消息推送


8.1为什么需要心跳保活?


由于移动网络的复杂性,心跳保活对于移动端IM来说显的尤为重要,加之手机省电、省流量策略的设计,如何实现心跳保活则也非常重要,文章《基于TCP协议的移动端IM仍然需要心跳保活机制》或许可以解答你的疑问。

8.2iOS端的后台消息推送


因为iOS平台的特殊性,iOS应用一旦退到后台,应用本身是无法用代码来实现网络保活的,也就无法自行实现后台消息推送了。

以下文章将有助于你理解iOS平台的后台消息推送原理:


8.3Android端的心跳保活和后台消息推送


鉴于Android平台众所周之的分化和互不兼容问题,Android端IM在处理心跳保活和后台消息推送时,遇到了不少的麻烦。而且,由于Android应用的生命周期管理是由系统控制,因而如何保证您的IM所在进程或后台服务不被系统杀死,是实现心跳保活和后台消息推送的实现基础。

以下文章可为你的Android端IM的心跳保活和后台推送方案的设计提供参考:


(更多同类文章:此进入…

九、移动端IM系统的架构设计


IM其本质是一套消息发送与投递系统,或者说是一套网络通信系统,归根结底就是两个词:存储与转发。但一个成熟的移动端IM系统要想正常运转,涉及的内容则远不止这些,而最考验技术功底的就是服务端架构的设计与实现。

没有过IM系统开发经验的人,可能对以上观点嗤之以鼻,在此借用TeamTalk的设计者的一段话:“IM服务器开发,从功能抽象的角度看可能非常简单,可以认为是管理大量的客户端连接和在不同的客户端之间传递消息,但具体到实现细节就比较复杂了。打个不恰当的比喻,OS的功能抽象也非常简单,无非是进程间的调度和硬件资源的管理,但要是自己去实现一个,一般人也就只能呵呵了。”

我们以一个典型方案为例,首先来提炼一下一个IM系统的主要需求:包括账号、关系链、在线状态显示、消息交互(文本、图片、语音)、实时视频电话......。

要处理好上述需求,我们通常需要从以下方面进行考量从而设计出合适的架构:

  • 如果采用可靠传输协议TCP,需要考虑到负载问题:短连接实现账号、关系链相关业务,长连接实现上线、信息推送;
  • 后台架构的灵活性、可扩展性:支持分布式部署——把网络层、业务逻辑层、数据层分离,网络层和业务层支持负载均衡策略、数据层支持分布式存储;
  • 客户端SDK的易用性:把网络层、数据层分离、业务逻辑层分离。

另外,一个典型的IM系统架构设计,还有以下性能方面的热点问题需要设计者重点关注:

  • 编码角度:采用高效的网络模型,线程模型,I/O处理模型,合理的数据库设计和操作语句的优化;
  • 垂直扩展:通过提高单服务器的硬件资源或者网络资源来提高性能;
  • 水平扩展:通过合理的架构设计和运维方面的负载均衡策略将负载分担,有效提高性能;后期甚至可以考虑加入数据缓存层,突破IO瓶颈;
  • 系统的高可用性:防止单点故障;
  • 在架构设计时做到业务处理和数据的分离,从而依赖分布式的部署使得在单点故障时能保证系统可用。
  • 对于关键独立节点可以采用双机热备技术进行切换。
  • 数据库数据的安全性可以通过磁盘阵列的冗余配置和主备数据库来解决。

鉴于篇幅有限,架构设计方面的内容本文就不深入展开了。

群聊是IM中架构设计的技术难点,以下是群聊方面的专门文章:


以下文章将为你的移动端IM的其它架构设计带来一定的参考意义:


(更多同类文章: 点此进入…

十、移动端IM的通信安全


IM(尤其移动端IM)的安全性一直是开发者需要优先考虑的基础问题,如何正确地理解和使用加密技术则显的尤其重要。IM系统大都采用C/S、B/S、P2P等技术来实现即时通信的功能,软件编制没有统一的标准,使得IM系统本身存有多种安全漏洞,加上用户缺乏安全意识,导致在使用即时通信系统时出现各种安全问题。

当今的计算机密码学的主要作用有:加密( Encryption)、认证(Authentication),鉴定(Identification) 。

  • 加密:防止坏人获取你的数据;
  • 认证:防止坏人修改了你的数据而你却并没有发现;
  • 鉴权:防止坏人假冒你的身份。

这些基本概念和加密算法原理就不在此展开叙述了。

以下文章或许有助于您设计出安全的移动端IM系统:


(更多同类文章:点此进入…

十一、有关IM中的实时音视频技术


IM应用中的实时音视频技术,几乎是IM开发中的最后一道高墙。原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的。实时音视频技术上的实现内容主要包括:音视频的采集、编码、网络传输、解码、播放等环节。这么多项并不简单的技术应用,如果把握不当,将会在在实际开发过程中遇到一个又一个的坑。

以下文章有助于您从零理解IM的实时音视频开发的方方面面:


(更多同类文章: 点此进入…

另外,大家都喜欢开源免费的东西,WebRTC是为数不多的开源且质量上乘的实时音视频解决方案之一,资料如下:


十二、移动端IM开发的其它热点问题


移动端IM开发中还会遇到上述内容未提及的内容,以下文章或许您用的上:


十三、开始动手实践(带参考源码)



十四、推荐技术方案(感谢支持)


14.1MobileIMSDK工程(已开源)↘


新手入门一篇就够:从零开发移动端IM_mb-logo.png
MobileIMSDK是一套专为移动端开发的原创IM通信层框架(2023年4月最新发布了微信小程序端),支持Android、iOS、Java、H5微信小程序端Uniapp端等,详细介绍请见:http://www.52im.net/thread-52-1-1.html

14.2MobileIMSDK-Web工程(捐助作者得精编源码)↘


新手入门一篇就够:从零开发移动端IM_b.png
MobileIMSDK-Web是一套纯JS编写的Web端即时通讯框架(含服务端),主要应用于Web网页方式的即时通讯场景下(包括但不限于手机端、PC端的网页聊天或消息推送等),详细介绍请见:http://www.52im.net/thread-959-1-1.html

14.3RainbowAV工程(捐助作者得精编源码)↘


新手入门一篇就够:从零开发移动端IM_rbav-220816.jpeg
RainbowAV是一套完整移动端实时音视频框架(含服务端),支持分布式,不依赖于第3方服务,可私有化部署,使用方便,部署简单,轻量级、模块化设计,开发者可方便修改、演进甚至用于2次开发,详细介绍请见:http://www.52im.net/thread-1027-1-1.html

14.4RainbowChat产品级移动端IM系统 ↘


新手入门一篇就够:从零开发移动端IM_2.png
RainbowChat是一套基于MobileIMSDK的产品级移动端IM系统。RainbowChat源于真实运营的产品,运营统计:点此进入,不同于市面上开源或售卖的demo级代码,RainbowChat的产品前身已被成千上万真实的客户使用过,解决了大量的屏幕适配、细节优化、机器兼容问题(可自行下载体验:专业版下载),详细介绍请见:http://www.52im.net/thread-19-1-1.html

14.5RainbowChat-Web产品级Web端IM系统 ↘


新手入门一篇就够:从零开发移动端IM_3.jpg
RainbowChat-Web是一套基于MobileIMSDK-Web的网页端IM系统。不同于市面上某些开源或淘宝售卖的demo级代码,RainbowChat-Web的产品级代码演化自真正运营过的商业产品,其所依赖的通信层核心SDK(即MobileIMSDK-Web)已在数年内经过大量客户及其辐射的最终用户的使用和验证。详细介绍请见:http://www.52im.net/thread-2483-1-1.htmlRainbowChat-Web是RainbowChat的姊妹产品

附录:其它即时通讯文章分类汇总


➊ WEB端即时通讯技术文章汇总:点此进入
➋ 推送技术文章汇总:点此进入
➌ 有关QQ、微信的技术文章:点此进入
➍ 有关QQ、微信的技术故事:此进入

更多精华文章分类请见:即时通讯网技术精选

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

评分

3

查看评分

上一篇:Android进程保活详解:一篇文章解决你的所有疑问下一篇:58同城网的IM技术架构演变之路

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

推荐方案
评论 252
好全的资料啊
签名: 该会员没有填写今日想说内容.
引用:kezhaoyuan 发表于 2016-08-03 09:17
好全的资料啊

是啊,这样的资料可是不容易找到的
满满的干货
引用:qianxing 发表于 2016-08-03 13:28
满满的干货

那必须的
从这篇文章开始学习im
签名: 该会员没有填写今日想说内容.
引用:木子凤 发表于 2016-08-05 08:18
从这篇文章开始学习im

666666
签名: java
干货啊,尤其是IOS的保活确实让人头疼
干货,最近产品正要添加IM功能,有学习资料了
引用:qingwanan 发表于 2016-08-21 15:05
干货,最近产品正要添加IM功能,有学习资料了

太感谢了这么丰富的资料,十分感谢
签名: asdf
引用:otnp 发表于 2016-08-23 14:20
太感谢了这么丰富的资料,十分感谢

希望对你有用 !
篇篇都是经典啊
引用:yijunsign 发表于 2016-08-23 20:16
篇篇都是经典啊

过奖
总结得十分详细,十分感谢!楼主创建的这个网站太棒了!
好东西,想学习
十分感谢~~~
写的,太好了。
签名: 遇见
顶一个
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部