• 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数据打包和解析。

            

            

  • 相关阅读:
    使用SQLite做本地数据缓存的思考
    毕业后第一次跳槽面试的点滴记录
    Nancy基于JwtBearer认证的使用与实现
    谈谈Nancy中让人又爱又恨的Diagnostics【上篇】
    CentOS 7.x 防火墙开放端口相关用法记录
    浅析如何在Nancy中使用Swagger生成API文档
    浅析如何在Nancy中生成API文档
    初探CSRF在ASP.NET Core中的处理方式
    微信小程序支付简单小结与梳理
    浅析Content Negotation在Nancy的实现和使用
  • 原文地址:https://www.cnblogs.com/tangjianfeng/p/9572072.html
Copyright © 2020-2023  润新知