移动IM开发指南1:如何进行技术选型
《移动IM开发指南》系列文章将会介绍一个IM APP的方方面面,包括技术选型、登陆优化等。此外,本文作者会结合他在网易云信多年iOS IMSDK开发的经验,深度分析实际开发中的各种常见问题。
推荐阅读
移动IM开发指南2:心跳指令详解
移动IM开发指南3:如何优化登录模块
通讯方式选择
IM通讯方式无非两种选择:设备直连(P2P)和通过服务器中转。
(1)P2P
P2P多见于局域网内聊天工具,典型的应用有:飞鸽传书等。这类软件在启动后一般做两件事情:
l 进行UDP广播:发送自己信息和接受同局域网内其他端信息
l 开启TCP监听:等待其他端进行连接
详细的流程可以参考飞鸽传书源码。但是这种方式在有种种限制和不便:一方面它只适合在线的点对点消息传输,对离线,群组等业务支持不够。另一方面由于 NAT 的存在,使得不同局域网内机器互联难度大大上升,在某些网络类型(对称NAT)下无法建立连接。
(2)服务器中转
几乎所有互联网IM产品都采用服务器中转这种方式进行消息传输,相对于P2P的方式,它有如下的优点:
l 能够支持更多P2P无法支持或支持不好的业务,如离线消息,群组,聊天室服务
l 方便业务逻辑的拓展和新旧版本的兼容
当然它也有自己的问题:服务器架构复杂,并发要求高。
网络连接方式
IM主流网络连接方式有两种:
l 基于TCP的长连接
l 基于HTTP短连接PULL的方式
后者常见于WEB IM系统(当然现在很多WEBIM都是基于WebSocket实现),它的优点是实现简单,方便开发上手,问题是流量大,服务器负载较大,消息及时性无法很好地保证,对大规模的用户量支持不够,比较适合小型的IM系统,如小网站的客户系统。
基于TCP长连接则能够更好地支持大批量用户,问题是客户端和服务器的实现比较复杂。当然也还有一些变种,如下行使用MQTT进行服务器通知/消息的下发,上行使用HTTP短连接进行指令和消息的上传。这种方式能够保证下行消息/指令的及时性,但是在弱网络下上行慢的问题还是比较严重。早期的来往就是基于这种方式。
协议选择
IM协议选择原则一般是:易于拓展,方便覆盖各种业务逻辑,同时又比较节约流量。后一点的需求在移动端IM上尤其重要。
常见的协议有:XMPP;SIP;MQTT;私有协议。
l XMPP协议的优点在于:协议开源,可拓展性强,在各个端(包括服务器)有各种语言的实现,开发者接入方便。
但是缺点也是不少:XML表现力弱,有太多冗余信息,流量大,实际使用时有大量天坑。
l SIP协议多用于VOIP相关的模块,是一种文本协议,由于我并没有实际用过,所以不做评论,但从它是文本协议这一点几乎可以断定它的流量不会小。
l MQTT的优点是协议简单,流量少,但是它并不是一个专门为IM设计的协议,多使用于推送。
l 市面上几乎所有主流IM APP都是使用私有协议,一个被良好设计的私有协议一般有如下优点:高效,节约流量(一般使用二进制协议),安全性高,难以破解。缺点则是在开发初期没有现有样列可以参考,对于设计者的要求比较高。
一个好的协议需要满足如下条件:高效,简洁,可读性好,节约流量,易于拓展,同时又能够匹配当前团队的技术堆栈。基于如上原则,我们可以推出: 如果团队小,团队技术在IM上积累不够可以考虑使用XMPP或者MQTT+HTTP短连接的实现。反之可以考虑自己设计和实现私有协议。
私有协议的设计
l 序列化选择
移动互联网相对于有线网络最大特点是:带宽低,延迟高,丢包率高和稳定性差,流量费用高。所以在私有协议的序列化上一般使用二进制协议,而不是文本协议。常见的二进制序列化库有protobuf和MessagePack,当然你也可以自己实现自己的二进制协议序列化和反序列的过程,比如蘑菇街的TeamTalk。但是前面二者无论是可拓展性还是可读性都完爆TeamTalk(TeamTalk连Variant都不支持,一个int传输时固定占用4个字节),所以大部分情况下还是不推荐自己去实现二进制协议的序列化和反序列化过程。
l 协议格式设计
基于TCP的应用层协议一般都分为包头和包体(如HTTP),IM协议也不例外。包头一般用于表示每个请求/反馈的公共部分,如包长,请求类型,返回码等。 而包头则填充不同请求/反馈对应的信息。
一个最简单的包头可以定义为
以心跳包为例,假设当前的serial为1,心跳包的command为10,那么使用MessagePack做序列化时:length=4,serial=1,command=10,code=0,每个字段各占一个字节,包体为空,仅需要4个字节。
当然这是最简单的一个例子,面对真正的业务逻辑时,包体里面会需要塞入更多地信息,这个需要开发根据自己的业务逻辑总结公共部分,如为了兼容加入的协议版本号,为了负载均衡加入的模块id等。
上面就是IM系统大致的选型过程,包含了通讯方式,连接方式,协议选择,协议设计。但是实际开发过程中还有大量的问题需要处理。《移动IM开发指南》系列文章第二篇将会为大家解答实际开发中的常见问题。
移动IM开发指南1:如何进行技术选型相关推荐
- 客户端开发GUI框架对比与技术选型总结
客户端开发GUI框架对比与技术选型总结 客户端开发技术日新月易,目前客户端开发的GUI框架选型大致会从以下几个技术路线中进行选择: 纯系统原生GUI库 第三方库 基于Chromium + Node.j ...
- EMIS快速开发平台 - 微服务版技术选型
http://demo.zuoyour.com/system/login EMIS快速开发平台 - 微服务版技术选型 开发框架:Spring Boot 2.1.3.RELEASE 微服务:Spring ...
- 移动web现状、viewport视口、二倍图、移动web开发主流方案、布局技术选型(流式布局、flex弹性布局、less+rem+媒体查询布局、混合布局、媒体查询、bootstrap)
移动端web现状: 移动端常见浏览器:UC浏览器,QQ浏览器,Opera浏览器,百度手机浏览器,360安全浏览器,谷歌浏览器,搜狗手机浏览器,猎豹浏览器及杂牌浏览器.移动端常见的浏览器都是基于webk ...
- Java开发中Websocket的技术选型参考
1. 前言 Websocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 ...
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 实现插件...
插件契约介绍 我们知道,要基于平台(容器)加插件的这种模式进行开发,我们必须定义一组契约,用于约束模块插件开发,也就是说,模块插件需要遵守一定的标准进行开发,才能正常被容器调用,这就是IModule所 ...
- 即时通讯 IM 开发指南 1:如何进行技术选型
<移动IM开发指南>系列文章将会介绍一个IM APP的方方面面,包括技术选型.登陆优化等.此外,本文作者会结合他在网易云信多年 iOS IM SDK 开发的经验,深度分析实际开发中的各种常 ...
- 综合交易平台API技术开发指南
综合交易平台API技术开发指南 第一章CTP 产品特性 1. 如何获取综合交易平台(Comprehensive Transaction Platform 以下简称 CTP)证券(期 货)交易及行情 ...
- Android插件化开发指南——Hook技术(一)【长文】
文章目录 1. 前言 2. 将外部dex加载到宿主app的dexElements中 3. 插件中四大组件的调用思路 4. Hook 2.1 对startActivity进行Hook 2.1.1 AMS ...
- (转)PKI技术及应用开发指南
PKI技术及应用开发指南 级别: 初级 李明柱 博士 (mzli@263.net)北京邮电大学信息安全中心 2002 年 6 月 01 日 公钥基础设施(Public Key Infrastructu ...
最新文章
- python turtle画彩虹-Python基础实例——绘制彩虹(turtle库的应用)
- MyEclipse 快捷键及经验总结
- 12c集群日志位置_面试问Redis集群,被虐的不行了......
- P3480-[POI2009]KAM-Pebbles【阶梯博弈】
- 写第一个spark程序(wordcount)
- 使用vSAN RVC进一步了解vSAN环境
- 账号管理工具_新媒体账号管理工具,自媒体运营神器,管理多个账号很简单
- java.lang.ClassNotFoundException: net.sf.json.JSONObject
- python做出代码结构图_数据结构之图的代码实现(使用Python实现)
- 华为畅享20为什么没有计算机,华为畅享20 Pro强势来袭:即刻5G,不等待
- 句子迷,语录,俞凌雄
- RFS实例登录126邮箱/利用cookie登陆百度
- 【jq练习】基本选择器
- 盘点:当今十大备份应用软件
- 【web-攻击用户】(9.4)跨域捕获数据——通过注入HTML捕获数据、注入CSS捕获数据、JavaScript劫持
- Paper:可解释性之VI/PFI《All Models are Wrong, but Many are Useful: Learning a Variable’s Importance》翻译与解读
- 动画云创始人胥克谦课程格子创始人李天放分享创业经历
- notepad ++ 百度云下载
- SAP S/4HANA生产订单的BAdI增强点之Initialize方法
- input框不能输入
热门文章
- ZeroMQ之Publish/Subscribe (Java)
- obj.toSource()
- php读取txt插入数据库,PHP读取TXT文件插入数据库
- 深度学习算法_爱奇艺深度学习算法实习生面经
- bq4050读固件_stm32f767 实现模拟SMBUS驱动bq4050
- SCI论文写作--中科院自动化所牛博士教你如何搞科研
- 自定义Matlab功能函数——10进制整数矩阵转二进制字符矩阵
- servlet 中 out.println(中文) 乱码 问题
- 医疗器械软件网络安全法规和标准概述(附所有标准)
- python response.read_AttributeError:“Response”对象没有“read”属性