回覆列表
  • 1 # 草灘二哥

    ios原生的socket用起來不是很直觀,所以我用的是AsyncSocket這個第三方庫,對socket的封裝比較好,只是好像沒有帶外傳輸(out—of-band) 如果你的伺服器需要傳送帶外資料,可能得想下別的辦法

    環境

    下載AsyncSockethttps://github.com/robbiehanson/CocoaAsyncSocket類庫,將RunLoop資料夾下的AsyncSocket.h, AsyncSocket.m, AsyncUdpSocket.h, AsyncUdpSocket.m 檔案複製到自己的project中

    新增CFNetwork.framework, 在使用socket的檔案頭

    #import <sys/socket.h>

    #import <netinet/in.h>

    #import <arpa/inet.h>

    #import <unistd.h>

    使用

    1. socket 連線

    即時通訊最大的特點就是實時性,基本感覺不到延時或是掉線,所以必須對socket的連線進行監視與檢測,在斷線時進行重新連線,如果使用者退出登入,要將socket手動關閉,否則對伺服器會造成一定的負荷。

    一般來說,一個使用者(對於ios來說也就是我們的專案中)只能有一個正在連線的socket,所以這個socket變數必須是全域性的,這裡可以考慮使用單例或是AppDelegate進行資料共享,本文使用單例。如果對一個已經連線的socket物件再次進行連線操作,會丟擲異常(不可對已經連線的socket進行連線)程式崩潰,所以在連線socket之前要對socket物件的連線狀態進行判斷

    使用socket進行即時通訊還有一個必須的操作,即對伺服器傳送心跳包,每隔一段時間對伺服器傳送長連線指令(指令不唯一,由伺服器端指定,包括使用socket傳送訊息,傳送的資料和格式都是由伺服器指定),如果沒有收到伺服器的返回訊息,AsyncSocket會得到失去連線的訊息,我們可以在失去連線的回撥方法裡進行重新連線。

    先建立一個單例,命名為Singleton

    Singleton.h

    // Singleton.h#import "AsyncSocket.h"#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \staticdispatch_once_t onceToken = 0; \

    __strongstaticid sharedInstance = nil; \

    dispatch_once(&onceToken, ^{ \

    sharedInstance = block(); \

    }); \

    return sharedInstance; \

    @interfaceSingleton : NSObject+ (Singleton *)sharedInstance;

    @end

    Singleton.m

  • 中秋節和大豐收的關聯?
  • 天貓魔盒賣的如此之好,用過的朋友你們怎麼看?