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的更多相关文章

  1. iOS - swift项目接入bugly - 报错, 配置符号表,下载Java环境,

    1.pod 安装,无需配置任何东西 2.终端找到路径: pod install 3.在 appdelegate 导入  import Bugly extension AppDelegate{ /// ...

  2. iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

    如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可以借助VOIP的模式来实现这一需求.但是如果的应用程序并不是正真的VOIP应用,那当你把你的应用提交到AppStore的时候 ...

  3. [转] iOS应用中通过设置VOIP模式实现休眠状态下socket的长连接

      转自:http://blog.csdn.net/missautumn/article/details/17102067 如果你的应用程序需要在设备休眠的时候还能够收到服务器端发送的消息,那我们就可 ...

  4. Asp.Net实现Http长连接推送

    话说最新帮一个朋友搞智能家居方面的东西,做一个云平台.主要作用手机在局域网外环境时对手机客户端和智能网关中命令的互相转发. 目前已经有了一个稳定的Socket版本,但是考虑到以后的扩展和性能指标要改成 ...

  5. WCF实现长连接

    由于WCF的机制,连接池会在连接建立一定时间后超时,即使设置了超时时间非常长,也可能被服务端系统主动回收.之前做项目时碰到了这个问题,所以项目上考虑采用长连接,自动管理连接池,当连接超时后,自动重建, ...

  6. PHP-CI框架数据库连接默认是长连接,需要注意应用场景

    在CI框架的数据库配置文件中$db['default'] ['pconnect'] = TRUE,永久的数据库连接是指在您的脚本结束运行时不关闭的连接. 当收到一个永久连接的请求时,PHP将检查是否已 ...

  7. 基于心跳的socket长连接

    http://coach.iteye.com/blog/2024444 基于心跳的socket长连接 博客分类: http socket 案例: 心跳: socket模拟网页的报文连接某个网站,创建t ...

  8. Socket的长连接和短连接

    讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建 ...

  9. java如何实现Socket的长连接和短连接

    讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建 ...

随机推荐

  1. Pig UDF 用户自定义函数

    注册UDF do.pig的内容如下: register /xx/yy.jar data = load 'data'; result = foreach data generate aa.bb.Uppe ...

  2. Ubuntu 16.04 c++ Google框架单元测试

    环境:Ubuntu 16.04 在github网站上下载gtest框架:终端输入git clone https://github.com/google/googletest.git 然后找到 gool ...

  3. [翻译] INSSearchBar

    INSSearchBar 效果: An animating search bar. 一个带动画效果的search bar. Originally developed for ShopNow v2. ( ...

  4. 模板(template)包含与继承

    Django 模板查找机制: Django 查找模板的过程是在每个 app 的 templates 文件夹中找(而不只是当前 app 中的代码只在当前的 app 的 templates 文件夹中找). ...

  5. Linux ifconfig命令详解

    ifconfig(interfaces config).通常需要以root身份登录或使用sudo来使用ifconfig工具 ifconfig 命令用来查看和配置网络设备.当网络环境发生改变时可通过此命 ...

  6. November 10th 2016 Week 46th Thursday

    Live like you were dying, love because you do. 生如将逝,爱自本心. When faced with our darkest hour, hope is ...

  7. 词组查询以及多值映射等SolrNet使用中的细节问题

    转自:http://www.duxuan.cn/doc/6896594.html

  8. gitlab+jenkins环境搭建.md

    gitlab+jenkins自动化部署环境搭建 环境说明 系统 主机 IP 安装软件 CentOS 7 study-1 192.168.100.51 gitlab.git CentOS 7 study ...

  9. HBase学习之路 (九)HBase phoenix的使用

    HBase phoenix的下载 下载地址http://mirror.bit.edu.cn/apache/phoenix/ 选择对应的hbase版本进行下载,测试使用的是hbase-1.2.6版本

  10. C# 数字证书 RSA加密解密 加签验签

    KeyValuePair<string, string> keyPair = Encrypter.CreateRSAKey(); string privateKey = keyPair.V ...