iOS swift項目IM實現,從長鏈接到數據流解析分析之Socket

iOS  swift項目IM實現,從長鏈接到底層數據解析分析之Socketswift

一:項目簡介:  去年開始接手了一個國企移動項目,項目的需求是實現IM即時通信功能。安全

      * 一期版本功能包括了:性能優化

      1.公司業務的審批,報價和授標審批流程;服務器

      2.單人的聊天和羣組聊天(領導平常工做交流);網絡

      3.聊天消息包括支持文字類消息,語言,圖片,而且語言支持跨平臺;框架

      4.對消息的網絡數據傳遞實現加密壓縮處理,保證數據安全傳輸;異步

      * 項目特色:socket

        由於項目業務的:審批,報價和授標審批流程的特殊性, IM的實現不能應用第三方,好比:極光推送等,因此須要實現處理Socket底層數據解刨。tcp

 

二: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數據打包和解析。

        

        

相關文章
相關標籤/搜索