移动IM开发指南1:如何进行技术选型

《移动IM开发指南》系列文章将会介绍一个IM APP的方方面面,包括技术选型、登陆优化等。此外,本文作者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各种常见问题。

推荐阅读

移动IM开发指南2:心跳指令详解

移动IM开发指南3:如何优化登录模块

通讯方式选择

IM通讯方式无非两种选择:设备直连(P2P)和通过服务器中转

1. P2P

P2P多见于局域网内聊天工具,典型的应用有:飞鸽传书等。这类软件在启动后一般做两件事情:

  • 进行UDP广播:发送自己信息和接受同局域网内其他端信息
  • 开启TCP监听:等待其他端进行连接

详细的流程可以参考飞鸽传书源码。但是这种方式在有种种限制和不便:一方面它只适合在线的点对点消息传输,对离线,群组等业务支持不够。另一方面由于 NAT 的存在,使得不同局域网内机器互联难度大大上升,在某些网络类型(对称NAT)下无法建立连接。

2. 服务器中转

几乎所有互联网IM产品都采用服务器中转这种方式进行消息传输,相对于P2P的方式,它有如下的优点:

  • 能够支持更多P2P无法支持或支持不好的业务,如离线消息,群组,聊天室服务
  • 方便业务逻辑的拓展和新旧版本的兼容

当然它也有自己的问题:服务器架构复杂,并发要求高。

网络连接方式

IM主流网络连接方式有两种:

  • 基于TCP的长连接
  • 基于HTTP短连接PULL的方式

后者常见于WEB IM系统(当然现在很多WEB IM都是基于WebSocket实现),它的优点是实现简单,方便开发上手,问题是流量大,服务器负载较大,消息及时性无法很好地保证,对大规模的用户量支持不够,比较适合小型的IM系统,如小网站的客户系统。

基于TCP长连接则能够更好地支持大批量用户,问题是客户端和服务器的实现比较复杂。当然也还有一些变种,如下行使用MQTT进行服务器通知/消息的下发,上行使用HTTP短连接进行指令和消息的上传。这种方式能够保证下行消息/指令的及时性,但是在弱网络下上行慢的问题还是比较严重。早期的来往就是基于这种方式。

协议选择

IM协议选择原则一般是:易于拓展,方便覆盖各种业务逻辑,同时又比较节约流量。后一点的需求在移动端IM上尤其重要。

常见的协议有:XMPP;SIP;MQTT;私有协议。

  • XMPP协议的优点在于:协议开源,可拓展性强,在各个端(包括服务器)有各种语言的实现,开发者接入方便。但是缺点也是不少:XML表现力弱,有太多冗余信息,流量大,实际使用时有大量天坑。
  • SIP协议多用于VOIP相关的模块,是一种文本协议,由于我并没有实际用过,所以不做评论,但从它是文本协议这一点几乎可以断定它的流量不会小。
  • MQTT的优点是协议简单,流量少,但是它并不是一个专门为IM设计的协议,多使用于推送。
  • 市面上几乎所有主流IM APP都是使用私有协议,一个被良好设计的私有协议一般有如下优点:高效,节约流量(一般使用二进制协议),安全性高,难以破解。缺点则是在开发初期没有现有样列可以参考,对于设计者的要求比较高。

一个好的协议需要满足如下条件:高效,简洁,可读性好,节约流量,易于拓展,同时又能够匹配当前团队的技术堆栈。基于如上原则,我们可以推出: 如果团队小,团队技术在IM上积累不够可以考虑使用XMPP或者MQTT+HTTP短连接的实现。反之可以考虑自己设计和实现私有协议。

私有协议的设计

  • 序列化选择

移动互联网相对于有线网络最大特点是:带宽低,延迟高,丢包率高和稳定性差,流量费用高。所以在私有协议的序列化上一般使用二进制协议,而不是文本协议。常见的二进制序列化库有protobuf和MessagePack,当然你也可以自己实现自己的二进制协议序列化和反序列的过程,比如蘑菇街的TeamTalk。但是前面二者无论是可拓展性还是可读性都完爆TeamTalk(TeamTalk连Variant都不支持,一个int传输时固定占用4个字节),所以大部分情况下还是不推荐自己去实现二进制协议的序列化和反序列化过程。

  • 协议格式设计

基于TCP的应用层协议一般都分为包头和包体(如HTTP),IM协议也不例外。包头一般用于表示每个请求/反馈的公共部分,如包长,请求类型,返回码等。 而包头则填充不同请求/反馈对应的信息。

一个最简单的包头可以定义为

以心跳包为例,假设当前的serial为1,心跳包的command为10,那么使用MessagePack做序列化时:length=4,serial=1,command=10,code=0,每个字段各占一个字节,包体为空,仅需要4个字节。

当然这是最简单的一个例子,面对真正的业务逻辑时,包体里面会需要塞入更多地信息,这个需要开发根据自己的业务逻辑总结公共部分,如为了兼容加入的协议版本号,为了负载均衡加入的模块id等。


上面就是IM系统大致的选型过程,包含了通讯方式,连接方式,协议选择,协议设计。但是实际开发过程中还有大量的问题需要处理。《移动IM开发指南》系列文章第二篇将会为大家解答实际开发中的常见问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PDF是一种常见的电子文档格式,具有跨平台兼容性和视觉一致性的特点。针对j-im开发文档,可以提供以下内容: 首先,开发文档应该包含有关j-im的介绍和概述。这部分内容可以详细阐述j-im的功能和特性,以及为什么选择使用j-im进行开发。同时,还可以提供j-im的系统要求,例如操作系统、硬件要求等信息。 其次,开发文档应该提供j-im的安装和配置说明。这部分内容可以指导开发者如何下载和安装j-im,并且提供详细的配置步骤,包括数据库配置、网络配置等。此外,还可以介绍如何获取j-im的API密钥和访问权限等相关信息。 接下来,开发文档应该详细介绍j-im的API接口。这部分内容可以列举所有可用的API接口及其功能,包括发送消息、创建聊天室、获取用户列表等。对于每个API接口,还应提供详细的参数说明、返回结果示例以及错误处理方法。 此外,开发文档还可以提供一些示例代码和开发指南,帮助开发者更好地理解和使用j-im。例如,可以提供各种编程语言下的示例代码,展示如何调用API接口和处理返回结果。同时,还可以提供一些常见问题和解答,以及一些最佳实践和开发技巧。 最后,开发文档应该包含一些附加信息,如术语表、参考资料和联系方式等。这些信息可以帮助开发者更好地理解j-im的相关概念和技术,以及与开发者沟通和反馈问题时的参考资料和联系方式。 总而言之,一份完整的j-im开发文档应该包含j-im的介绍、安装配置说明、API接口文档、示例代码和开发指南,以及一些附加信息。通过提供这些内容,开发者可以更加方便地了解和使用j-im进行开发。 ### 回答2: PDF: J-IM开发文档是一份介绍和指导如何开发使用J-IM的文档。J-IM是一个用于即时通讯的开发框架,可以用于构建各种类型的实时通信应用程序,包括聊天应用、社交媒体应用、在线游戏等。这份开发文档详细介绍了J-IM框架的各项功能和用法。 在开发文档中,首先会介绍J-IM的特点和优势,包括高效的消息传递、稳定的连接性和灵活的可扩展性。然后会介绍J-IM的架构和组件,包括客户端和服务器端的组成部分,以及它们之间的通信协议和接口。 接下来,开发文档会详细介绍如何使用J-IM框架进行开发。它会提供一些示例代码和案例,展示如何使用J-IM的API进行用户身份验证、消息发送和接收、在线状态管理等常见功能的实现。开发者可以根据这些示例进行修改和扩展,以满足自己应用的需求。 此外,开发文档还会介绍一些高级用法和技巧,如如何进行消息推送、文件传输、群组管理等。它也会提供一些性能优化和安全性考虑的建议,帮助开发者提升应用的稳定性和用户体验。 最后,开发文档提供了一些常见问题的解答和故障排除指南,以帮助开发者在遇到问题时快速解决。并且,开发者也可以通过J-IM官方网站或社区提出问题,交流经验和获取技术支持。 总之,PDF: J-IM开发文档为开发者提供了详尽的J-IM框架使用指南,帮助他们快速上手并开发出高质量的即时通讯应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值