iOS swift项目IM实现,从长连接到数据流解析分析之Socket
iOS swift项目IM实现,从长连接到底层数据解析分析之Socket
一:项目简介: 去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能。
* 一期版本功能包括了:
1.公司业务的审批,报价和授标审批流程;
2.单人的聊天和群组聊天(领导日常工作交流);
3.聊天消息包括支持文字类消息,语言,图片,并且语言支持跨平台;
4.对消息的网络数据传递实现加密压缩处理,保证数据安全传输;
* 项目特点:
因为项目业务的:审批,报价和授标审批流程的特殊性, IM的实现不能应用第三方,比如:极光推送等,所以需要实现处理Socket底层数据解刨。
二:iOS IM功能使用Socket的tcp请求协议来实现,推荐使用第三方sdk: CocoaAsyncSocket
CocoaAsyncSocket:OC的版本,是应用GCD写的异步处理,有兴趣的可以去看下原码
三:CocoaAsyncSocket
pod 'CocoaAsyncSocket' //可以通过pod集成
四:CocoaAsyncSocket init和delegate
----init分析------


----delegate分析------

* 实现CocoaAsyncSocket的4个代理来处理Socket通讯数据,下面分别分析各个代理的作用:
1. - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;
- 成功连接上服务器后,需要发送保持长连接的心跳机制,在成功回调方法中实现:

- 发送心跳机制的同时,发起账号登录验证

2.- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err;
* 有成功,那么必定会有失败:
- 失败需要即时更新连接状态,确保用户在连接失败的情况下,操作的安全性(不闪退),加以UI提示
更新的状态包括:1: 网络状态,2: 用户数据同步状态,3: 心跳间隔时间,4: 是否是强制重新连接
注:(一个健壮的性能又好的IM系统,需要考虑的因素很重要)
- 重新连接,在本项目总负责王总的建议下,一旦断开连接给予6次重连机会
注: 本项目总负责王总,是后台出生,整个项目的后台(报告EQ系统,ERP系统)系统都有王总搭建,后台的整个IM框架也是王总集成,维护和改进,
国企职位高并且技术全面的确实佩服。

3.- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;
- GCDAsyncSocket数据包发送,涉及了3种状态,分析如下:
第一种:数据包只有发送,没有回调数据包接受
- 第二种:数据包有发送, 确定有数据包接受
- 第三种:数据包有发送,不确定有数据包接受
- 分析:GCDAsyncSocket数据包的接收需要提前订阅(提供线程任务处理),如果提供的订阅任务用完了,那么GCDAsyncSocket 不会处理和回调新接收到的消息数据,didWriteData这个方法的实现就是处理兼容涉及的3种状态,保证新消息能被及时处理。

4.- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
- 新消息成功订阅,这里就开始对数据的解析,数据类型分为:
指令消息(syc指令),心跳消息,Init消息和Invoke(获取)消息;
- didReadData:方法中回调了tag字段,但是我们不能按照tag来区分,tag只是回调线程的标记,必须安照数据类型来区分

五:Socke总结
* CocoaAsyncSocket 的Socket 连接层到这里差不多了,上面列出来的条例都是需要非常注意的地方。
* IM连接层还有个非常重要的地方:需要对项目的网络状态时时监控,网络状态的改变需要做处理,
4G网络下需要对用户提醒,虚拟网络下需要优化处理IM任务, 在断开连接重连的情况下要优先判断网络状态,
这些都是对IM系统的性能优化,为项目的迭代打下坚韧的基础。
注:下一篇: iOS swift项目IM实现,从长连接到数据流解析分析之Payload数据打包和解析。


iOS swift项目IM实现,从长连接到数据流解析分析之Socket的更多相关文章
- iOS - swift项目接入bugly - 报错, 配置符号表,下载Java环境,
1.pod 安装,无需配置任何东西 2.终端找到路径: pod install 3.在 appdelegate 导入 import Bugly extension AppDelegate{ /// ...
- iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接
如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求.但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候 ...
- [转] iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接
转自:http://blog.csdn.net/missautumn/article/details/17102067 如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可 ...
- Asp.Net实现Http长连接推送
话说最新帮一个朋友搞智能家居方面的东西,做一个云平台.主要作用手机在局域网外环境时对手机客户端和智能网关中命令的互相转发. 目前已经有了一个稳定的Socket版本,但是考虑到以后的扩展和性能指标要改成 ...
- WCF实现长连接
由于WCF的机制,连接池会在连接建立一定时间后超时,即使设置了超时时间非常长,也可能被服务端系统主动回收.之前做项目时碰到了这个问题,所以项目上考虑采用长连接,自动管理连接池,当连接超时后,自动重建, ...
- PHP-CI框架数据库连接默认是长连接,需要注意应用场景
在CI框架的数据库配置文件中$db['default'] ['pconnect'] = TRUE,永久的数据库连接是指在您的脚本结束运行时不关闭的连接. 当收到一个永久连接的请求时,PHP将检查是否已 ...
- 基于心跳的socket长连接
http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...
- Socket的长连接和短连接
讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建 ...
- java如何实现Socket的长连接和短连接
讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建 ...
随机推荐
- ahjesus wp-autopost破解版,亲测可用
在funtion.php里 把fetchUrl 这个函数的判断去掉 直接执行判断为真的结果下面是修改后的函数 function fetchUrl($_var_22){ global $w ...
- 事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool
一.事件驱动 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较.实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的.早期则存在许多非事件驱动的程序,这样的程序,在需要等待 ...
- python中的字符串编码问题——3.各操作系统下的不同编码方式
各操作系统下的不同编码方式 先看一下 linux,python2.7 >>> B = b'\xc3\x84\xc3\xa8' >>> B.decode('utf- ...
- CSS 小结笔记之三种样式表
CSS 引入共有三种方式:内部样式表,内联样式(行内样式)表,外部样式表,当然也可以使用多重样式 内联样式 <div style="color:red;font-size:20px&q ...
- 8 tensorflow修改tensor张量矩阵的某一列
1.tensorflow的数据流图限制了它的tensor是只读属性,因此对于一个Tensor(张量)形式的矩阵,想修改特定位置的元素,比较困难. 2.我要做的是将所有的操作定义为符号形式的操作.也就是 ...
- Redis学习---Redis操作之有序集合
有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序. zadd(name, *args, **kw ...
- 【matlab】 幂法 求解最大特征值
一. 算法: 1.输入矩阵A,初始向量x误差限ep,最大迭代次数N 2.置 k = 1, m1 = 0; 3.求Xr-> norm(x) abs(Xr)=max[Xi] 1<=i< ...
- HashMap集合特点
>HashMap集合特点 HashMap:是基于哈希表的Map接口实现. 哈希表的作用是用来保证键的唯一性的. 不明白,直接看HashMap的put方法源码 //HashM ...
- spring-springmvc-hibernate项目小结
1. web.xml中别忘记加入spring监听器 <listener> <listener-class>org.springframework.web.context.Con ...
- 安全紧急预警-防范新型 Sigrun 勒索病毒
近日,互联网上出现一种 Sigrun 勒索病毒,其通过垃 圾邮件.网站捆绑软件等方式进行传播.该病毒一旦植入到 用户的服务器,将把系统文件加密为.sigrun 的文件,进而 向受害者勒索虚拟货币.该新 ...