iOS端IM开发从入门到填坑

IM开发从入门到填坑Demo

IM的实现方式

拿来主义,使用第三方IM服务

IM的第三方服务商国内有很多,底层协议基本上都是基于TCP的,类似有网易云信、环信、融云、极光IM、LeanCloud、云通讯IM(腾讯)、云旺IM(阿里)、容联云、小能、美洽等等,技术也相对比较成熟,提供后台管理和定制化的UI,拿来主义,半小时集成。

缺点也很明显:定制化程度太高,需要二次开发,很多东西我们不可控,关键是太贵了。如果IM对于APP只是一个辅助功能,如客服系统、消息推送等,也基本够用。

自己动手,切合业务自己实现

几乎所有互联网IM产品都用服务器中转方式进行消息传输。自己去实现也会面临许多选择:

1、传输协议的选择:TCP还是UDP?

2、选择哪种聊天协议进行开发:MQTT、XMPP、基于 Socket 原生或 WebSocket 的私有协议?

3、传输数据的格式:用JSON、还是XML、还是谷歌推出的ProtocolBuffer?

4、我们还有一些细节问题需要考虑,例如TCP的长连接如何保持,心跳机制,Qos机制,重连机制等等。另外,还有一些安全问题需要考虑。

一、传输协议的选择

移动端IM的传输协议选型:TCP还是UDP?

TCP:基于连接的可靠协议的全双工的可靠信道,有流量控制、差错控制等,占用系统资源较多,传输效率相对低

UDP:基于无连接的不可靠协议,没有足够的控制手段,传输效率高,有丢包问题

TCP和UDP的最完整的区别

基于UDP协议开发成本较高,容易各种丢包或乱序,一般小公司或技术不成熟或即时性要求不高的公司,多用TCP开发。

QQ-IM的私有协议:登录等安全性操作使用TCP协议,好友之间发消息主要使用UDP协议,内网传输文件采用了P2P技术,另外腾讯还用了自己的私有协议,来保证传输的可靠性。

二、聊天协议的选择

首先我们以实现方式来切入,基本上有以下四种实现方式:

基于Socket原生:代表框架 CocoaAsyncSocket。
基于WebSocket:代表框架 SocketRocket。
基于MQTT:代表框架 MQTTKit。
基于XMPP:代表框架 XMPPFramework。

以上四种方式都可以不使用第三方框架,直接基于OS底层Socket去实现我们的自定义封装。其中MQTT和XMPP为聊天协议,是最上层的协议,而WebSocket是传输通讯协议,它是基于Socket封装的一个协议。而上面所说的QQ-IM的私有协议,就是基于WebSocket或者Socket原生进行封装的一个聊天协议。

image.png

协议优劣对比

总之,iOS端要做一个真正的IM产品,一般都是基于Socket或WebSocket等,在之上加上一些私有协议来保证的。

三、实现一个简单的IM

1.Socket概述

Socket其实并不是一个协议,Socket通常也称作”套接字”,是对TCP/IP 或者UDP/IP协议封装的一组编程接口,用于描述IP地址和端口,使用socket实现进程之间的通信(跨网络的)。它工作在 OSI 模型会话层(第5层),Socket是对TCP/IP等更底层协议封装的一个抽象层,是一个调用接口(API)。网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,一个Socket由一个IP地址和一个端口号唯一确定。

image.png

网络架构

先看下基于C的BSD Socket提供的接口:

//socket 创建并初始化 socket,返回该 socket 的文件描述符,如果描述符为 -1 表示创建失败。int socket(int addressFamily, int type,int protocol)//关闭socket连接int close(int
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值