【原创】新手入门一篇就够:从零开发移动端IM

学习交流

- 即时通信开发交流群: 215891622 [推荐]php

1、前言

IM发展至今,已经是很是重要的互联网应用形态之一,尤为移动互联网时代,它正以无与论比的优点下降了沟通成本和沟通代价,对各类应用形态产生了深远影响。

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

本文将以新手的视角引导你阅读相关文章,以便为从零开发一个移动端IM作好方方面面的知识准备:包括但不限于网络编程基础、通讯协议的选型、IM的架构设计等等。文笔有限,若有不妥之处还请批评指正,但愿对你有用。(本文同步发布于:http://www.52im.net/thread-464-1-1.htmlhtml

2、读完本文的收获 

[1] 您将得到

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

android

[2] 您没法得到

鉴于IM技术的复杂性,IM开发相关的技术不是一篇文章所能展示的了,限于篇幅缘由本文将不包含任何实践性代码、也尽可能不对某项技术做深刻的展开,相关的实践性代码、资料、技术详解等请依据本文做者准备的文章逐个深刻阅读和学习,而这也偏偏是本文想达到的目的。git

3、题外话

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

好了,如下是正文内容。github

4、网络编程理论准备

[1] UDP、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的实际应用中提供必定的实践依据:缓存


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

5、网络编程基础实践

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

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


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

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

6、IM到底该用UDP仍是TCP协议?

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

固然,UDP和TCP各有各的应用场景,做为IM来讲,早期的IM由于服务端资源(服务器硬件、网络带宽等)比较昂贵且没有更好的办法来分担性能负载,因此不少时候会考虑使用UDP,这其中主要是早期的QQ为表明。

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

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


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

7、IM的数据通讯格式选型

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

精略分析一下,究其缘由,大概在于如下几点:

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


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

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


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

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

[1] 为何须要心跳保活?

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

[2] iOS端的后台消息推送

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

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

 

[3] Android端的心跳保活和后台消息推送

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

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


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

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

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

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

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

要处理好上述需求,咱们一般须要从如下方面进行考量从而设计出合适的架构:

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


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

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


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

如下文章将为你的移动端IM的架构设计带来必定的参考意义:


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

10、移动端IM的通讯安全

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

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

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

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

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


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

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

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

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


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

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

移动端IM开发中还会遇到上述内容未说起的内容,如下文章或许您用的上:
移动端IM开发须要面对的技术问题
开发IM是本身设计协议用字节流好仍是字符流好?
请问有人知道语音留言聊天的主流实现方式吗?
IM系统中如何保证消息的可靠投递(即QoS机制)
谈谈移动端 IM 开发中登陆请求的优化
彻底自已开发的IM该如何设计“失败重试”机制?
微信对网络影响的技术试验及分析(论文全文)
即时通信系统的原理、技术和应用(技术论文)
开源IM工程“蘑菇街TeamTalk”的现状:一场虎头蛇尾的开源秀
>> 更多同类文章 …… 

附录:其它即时通信文章

[1] 有关WEB端即时通信开发:
新手入门贴:史上最全Web端即时通信技术原理详解
Web端即时通信技术盘点:短轮询、Comet、Websocket、SSE
SSE技术详解:一种全新的HTML5服务器推送事件技术
Comet技术详解:基于HTTP长链接的Web端实时通讯技术
WebSocket详解(一):初步认识WebSocket技术
socket.io实现消息推送的一点实践及思路
>> 更多同类文章 ……

[2] 有关推送技术的文章:
iOS的推送服务APNs详解:设计思路、技术原理及缺陷等
Android端消息推送总结:实现原理、心跳保活、遇到的问题等
扫盲贴:认识MQTT通讯协议
一个基于MQTT通讯协议的完整Android推送Demo
求教android消息推送:GCM、XMPP、MQTT三种方案的优劣
移动端实时消息推送技术浅析
扫盲贴:浅谈iOS和Android后台实时消息推送的原理和区别
绝对干货:基于Netty实现海量接入的推送服务技术要点
移动端IM实践:谷歌消息推送服务(GCM)研究(来自微信)
为什么微信、QQ这样的IM工具不使用GCM服务推送消息?
>> 更多同类文章 ……

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

(本文同步发布于:http://www.52im.net/thread-464-1-1.html

相关文章
相关标签/搜索