iOS網絡編程筆記——GCDAsyncSocket使用


CocoaAsyncSocket為Mac和iOS提供了易於使用且強大的異步通信庫。

簡單的Socket通信包括了建連、斷開連接、發送socket業務請求、重連這四個基本功能。

1.建立連接:GCDAsyncSocket提供了四種方法

- (instancetype)init;
- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq;
- (instancetype)initWithDelegate:(nullable id<GCDAsyncSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq;
- (instancetype)initWithDelegate:(nullable id<GCDAsyncSocketDelegate>)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq;

#pragma mark Configuration

@property (atomic, weak, readwrite, nullable) id<GCDAsyncSocketDelegate> delegate;
#if OS_OBJECT_USE_OBJC
@property (atomic, strong, readwrite, nullable) dispatch_queue_t delegateQueue;
#else
@property (atomic, assign, readwrite, nullable) dispatch_queue_t delegateQueue;
#endif

- (void)getDelegate:(id<GCDAsyncSocketDelegate> __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr;
- (void)setDelegate:(nullable id<GCDAsyncSocketDelegate>)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue;

sq:是socket的線程,這個是可選的設置,如果你寫null,GCDAsyncSocket內部會幫你創建一個它自己的socket線程,如果你要自己提供一個socket線程的話,千萬不要提供一個並發線程,在頻繁socket通信過程中,可能會阻塞掉,個人建議是不用創建。

aDelegate:socket的代理。

dq:delegate的線程。

接着,在設置代理之后,你需要嘗試連接到相應的地址來確定你的socket是否能連通了:

- (BOOL)connectToHost:(NSString *)host
               onPort:(uint16_t)port
          withTimeout:(NSTimeInterval)timeout
                error:(NSError **)errPtr;

host是主機地址,port是端口號。

如果建連成功,會收到socket成功的回調,可以在這里面做一些做一些事情,比如說做socket的心跳處理。在這個委托方法中,我們可以取到一個socket對象一個服務器IP和一個端口號,你可以處理一切在連接建立之后應該馬上執行的事情,比如與服務器進行通信確認連接端以免出現其他人通過IP及端口隨意的和你的服務器通信,再比如開啟心跳包的發送,讓服務器一直可以確認你的存在。不管做什么,都是你和服務器的編寫者事前約定好的,就像數據傳輸格式什么的。

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port;

如果建連失敗了,會收到失敗的回調,我們可以在失敗里做一些重連的操作:

- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err;

 

那么socket已經建連了,該怎么發起socket通信呢?

2.首先要和后端開發人員協定好數據格式:

為了防止發生消息黏連,以便於后台和客戶端對兩條請求進行拆分,GCDAsyncSocket不支持自定義邊界符,它提供了四種邊界符供你使用\r\n、\r、\n、空字符串。

例如:

[NSString stringWithFormat:@"{\"version\":%d,\"reqType\":%d,\"body\":\"%@\"}\r\n",PROTOCOL_VERSION,reqType,reqBody];

在拼裝好socket請求之后,你需要調用GCDAsyncSocket的寫方法,來發送請求,然后在寫完成之后你會收到寫的回調:

[self.socket writeData:requestData withTimeout:-1 tag:0];

- (void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)tag;

timeout是超時時間,這個根據實際的需要去設置。

在寫之后,需要再調用讀方法,這樣才能收到你發出請求后從服務器那邊收到的數據。

[self.socketreadDataToData:[GCDAsyncSocket CRLFData] withTimeout:10 maxLength:50000 tag:0];

- (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag;
 

[GCDAsyncSocket CRLFData]這里是設置邊界符,maxLength是設置你收到的請求數據內容的最大值。

在讀回調里面,你可以根據不同業務來執行不同的操作。

3.斷開連接

只需要調用:

[self.socket disconnect];

有關socket原理可查看此篇博客:http://www.cnblogs.com/dolphinX/p/3460545.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM