新手入门一篇就够:从零开发移动端IM(转载)

来源 http://www.52im.net/thread-464-1-1.html

一、前言


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

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

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

二、读完本文的收获


1您将获得


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

2您无法获得


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

三、题外话


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

好了,以下是正文内容。

四、网络编程理论准备


1UDP、TCP理论基础


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

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


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

2深入理解TCP传输协议


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

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


3深入理解UDP传输协议


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

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


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


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

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

P2P技术详解(一):NAT详解——详细原理、P2P简介
P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
P2P技术详解(三):P2P技术之STUN、TURN、ICE详解

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


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

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

高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少
高性能网络编程(二):上一个10年,著名的C10K并发连接问题
高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了

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

五、网络编程基础实践


如果你认真读完了上一层的文章,是时候写些代码,来理论联系实际理解Socket通信的原理和实践了。

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


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

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


六、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应用开发的前期技术选型时,关于数据通信格式的选择,在同行的眼里,同样是个极富争议的话题。

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

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

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

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


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

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


1为什么需要心跳保活?


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

2iOS端的后台消息推送


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

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


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系统大都采用C/S、B/S、P2P等技术来实现即时通信的功能,软件编制没有统一的标准,使得IM系统本身存有多种安全漏洞,加上用户缺乏安全意识,导致在使用即时通信系统时出现各种安全问题。

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

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

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

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


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

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


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

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


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

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


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


移动端IM开发中还会遇到上述内容未提及的内容,以下文章或许您用的上:
移动端IM开发需要面对的技术问题
开发IM是自己设计协议用字节流好还是字符流好?
请问有人知道语音留言聊天的主流实现方式吗?
IM消息送达保证机制实现(一):保证在线实时消息的可靠投递
IM消息送达保证机制实现(二):保证离线消息的可靠投递
如何保证IM实时消息的“时序性”与“一致性”?
IM单聊和群聊中的在线状态同步应该用“推”还是“拉”?
IM群聊消息如此复杂,如何保证不丢不重?
谈谈移动端 IM 开发中登录请求的优化
IM群聊消息如此复杂,如何保证不丢不重?
IM开发基础知识补课(一):正确理解前置HTTP SSO单点登陆接口的原理
IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?
一种Android端IM智能心跳算法的设计与实现探讨(含样例代码)
移动端IM登录时拉取数据如何作到省流量?
通俗易懂:基于集群的移动端IM接入层负载均衡方案分享
完全自已开发的IM该如何设计“失败重试”机制?
微信对网络影响的技术试验及分析(论文全文)
即时通讯系统的原理、技术和应用(技术论文)
开源IM工程“蘑菇街TeamTalk”的现状:一场有始无终的开源秀
从客户端的角度来谈谈移动端IM的消息可靠性和送达机制
现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障
>>  更多同类文章 ……  

十三、参考技术方案


1MobileIMSDK工程(已开源)↘


新手入门一篇就够:从零开发移动端IM_a.png 
MobileIMSDK首版开发于2013年(截止2018年2月已更新至v3.2版),它主要使用原生代码编写,应用于非Web网页方式的移动端即时通讯场景下,详细介绍请见: http://www.52im.net/thread-52-1-1.html

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


新手入门一篇就够:从零开发移动端IM_b.png 
MobileIMSDK-Web首版开发于2016年(仍在持续升级中),完全使用JavaScript编写,主要应用于Web网页方式的即时通讯场景下(包括但不限于手机端、PC端的网页聊天或消息推送等),详细介绍请见: http://www.52im.net/thread-959-1-1.html

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


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

4RainbowChat产品级IM系统 ↘


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

附录1:其它即时通讯文章


[1] 有关WEB端即时通讯开发:
新手入门贴:史上最全Web端即时通讯技术原理详解
Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
SSE技术详解:一种全新的HTML5服务器推送事件技术
Comet技术详解:基于HTTP长连接的Web端实时通信技术
新手快速入门:WebSocket简明教程
WebSocket详解(一):初步认识WebSocket技术
WebSocket详解(二):技术原理、代码演示和应用案例
WebSocket详解(三):深入WebSocket通信协议细节
WebSocket详解(四):刨根问底HTTP与WebSocket的关系(上篇)
WebSocket详解(五):刨根问底HTTP与WebSocket的关系(下篇)
WebSocket详解(六):刨根问底WebSocket与Socket的关系
socket.io实现消息推送的一点实践及思路
LinkedIn的Web端即时通讯实践:实现单机几十万条长连接
Web端即时通讯技术的发展与WebSocket、Socket.io的技术实践
Web端即时通讯安全:跨站点WebSocket劫持漏洞详解(含示例代码)
开源框架Pomelo实践:搭建Web端高性能分布式IM聊天服务器
使用WebSocket和SSE技术实现Web端消息推送
详解Web端通信方式的演进:从Ajax、JSONP 到 SSE、Websocket
MobileIMSDK-Web的网络层框架为何使用的是Socket.io而不是Netty?
理论联系实际:从零理解WebSocket的通信原理、协议格式、安全性
>>  更多同类文章 ……

[2] 有关推送技术的文章:
iOS的推送服务APNs详解:设计思路、技术原理及缺陷等
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
扫盲贴:认识MQTT通信协议
一个基于MQTT通信协议的完整Android推送Demo
求教android消息推送:GCM、XMPP、MQTT三种方案的优劣
移动端实时消息推送技术浅析
扫盲贴:浅谈iOS和Android后台实时消息推送的原理和区别
绝对干货:基于Netty实现海量接入的推送服务技术要点
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
为何微信、QQ这样的IM工具不使用GCM服务推送消息?
极光推送系统大规模高并发架构的技术实践分享
从HTTP到MQTT:一个基于位置服务的APP数据通信实践概述
魅族2500万长连接的实时消息推送架构的技术实践分享
专访魅族架构师:海量长连接的实时消息推送系统的心得体会
深入的聊聊Android消息推送这件小事
>>  更多同类文章 ……

[3] 更多即时通讯技术好文分类:
http://www.52im.net/forum.php?mod=collection&op=all

附录2:来自IM大厂的精华文章汇总


[1] 有关QQ、微信的技术文章:
微信团队分享:微信每日亿次实时音视频聊天背后的技术解密
QQ音乐团队分享:Android中的图片压缩技术详解(上篇)
QQ音乐团队分享:Android中的图片压缩技术详解(下篇)
腾讯团队分享:手机QQ中的人脸识别酷炫动画效果实现详解
腾讯团队分享 :一次手Q聊天界面中图片显示bug的追踪过程分享
微信团队分享:微信Android版小视频编码填过的那些坑 》 
微信手机端的本地数据全文检索优化之路 》 
企业微信客户端中组织架构数据的同步更新方案优化实战
微信团队披露:微信界面卡死超级bug“15。。。。”的来龙去脉
QQ 18年:解密8亿月活的QQ后台服务接口隔离技术
月活8.89亿的超级IM微信是如何进行Android端兼容测试的
以手机QQ为例探讨移动端IM中的“轻应用”
一篇文章get微信开源移动端数据库组件WCDB的一切!
微信客户端团队负责人技术访谈:如何着手客户端性能监控和优化
微信后台基于时间序的海量数据冷热分级架构设计实践
微信团队原创分享:Android版微信的臃肿之困与模块化实践之路
微信后台团队:微信后台异步消息队列的优化升级实践分享
微信团队原创分享:微信客户端SQLite数据库损坏修复实践 》 
腾讯原创分享(一):如何大幅提升移动网络下手机QQ的图片传输速度和成功率 》 
腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(下篇) 》 
腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇) 》 
微信Mars:微信内部正在使用的网络层封装库,即将开源 》 
如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源 》 
开源libco库:单机千万连接、支撑微信8亿用户的后台框架基石 [源码下载] 》 
微信新一代通信安全解决方案:基于TLS1.3的MMTLS详解 》 
微信团队原创分享:Android版微信后台保活实战分享(进程保活篇) 》 
微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 》 
Android版微信从300KB到30MB的技术演进(PPT讲稿) [附件下载] 》 
微信团队原创分享:Android版微信从300KB到30MB的技术演进 》 
微信技术总监谈架构:微信之道——大道至简(演讲全文)
微信技术总监谈架构:微信之道——大道至简(PPT讲稿) [附件下载] 》 
如何解读《微信技术总监谈架构:微信之道——大道至简》
微信海量用户背后的后台系统存储架构(视频+PPT) [附件下载]
微信异步化改造实践:8亿月活、单机千万连接背后的后台解决方案 》 
微信朋友圈海量技术之道PPT [附件下载] 》 
微信对网络影响的技术试验及分析(论文全文) 》 
一份微信后台技术架构的总结性笔记 》 
架构之道:3个程序员成就微信朋友圈日均10亿发布量[有视频] 》 
快速裂变:见证微信强大后台架构从0到1的演进历程(一)
快速裂变:见证微信强大后台架构从0到1的演进历程(二) 》 
微信团队原创分享:Android内存泄漏监控和优化技巧总结 》 
全面总结iOS版微信升级iOS9遇到的各种“坑” 》 
微信团队原创资源混淆工具:让你的APK立减1M 》 
微信团队原创Android资源混淆工具:AndResGuard [有源码] 》 
Android版微信安装包“减肥”实战记录 》 
iOS版微信安装包“减肥”实战记录 》 
移动端IM实践:iOS版微信界面卡顿监测方案 》 
微信“红包照片”背后的技术难题 》 
移动端IM实践:iOS版微信小视频功能技术方案实录 》 
移动端IM实践:Android版微信如何大幅提升交互性能(一)
移动端IM实践:Android版微信如何大幅提升交互性能(二)
移动端IM实践:实现Android版微信的智能心跳机制 》 
移动端IM实践:WhatsApp、Line、微信的心跳策略分析 》 
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
移动端IM实践:iOS版微信的多设备字体适配方案探讨 》 
信鸽团队原创:一起走过 iOS10 上消息推送(APNS)的坑
腾讯信鸽技术分享:百亿级实时消息推送的实战经验
>>  更多同类文章 ……

[2] 有关QQ、微信的技术故事:
2017微信数据报告:日活跃用户达9亿、日发消息380亿条
腾讯开发微信花了多少钱?技术难度真这么大?难在哪?
技术往事:创业初期的腾讯——16年前的冬天,谁动了马化腾的代码 》 
技术往事:史上最全QQ图标变迁过程,追寻IM巨人的演进历史 》 
技术往事:“QQ群”和“微信红包”是怎么来的? 》 
开发往事:深度讲述2010到2015,微信一路风雨的背后 》 
开发往事:微信千年不变的那张闪屏图片的由来 》 
开发往事:记录微信3.0版背后的故事(距微信1.0发布9个月时) 》 
一个微信实习生自述:我眼中的微信开发团队
首次揭秘:QQ实时视频聊天背后的神秘组织
>>  更多同类文章 ……


  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值