GCDAsyncSocket的使用

什么是GCDAsyncSocket

GCDAsyncSocket 是用于 OS X 和 iOS 上的異步 Socket 網絡通訊包。提供了易用而且功能強大的異步套接字開發庫

https://github.com/robbiehanson/CocoaAsyncSocket

基本使用

dispatch_queue_tqueue = dispatch_queue_create("com.test.testsocket.setter", DISPATCH_QUEUE_SERIAL);

_socket = [[GCDAsyncSocket alloc] initWithDelegate:selfdelegateQueue:queue socketQueue:nil];

上面這兩部就做好了初始化的操作,而且要注意,socket在整個項目中都會用到,所以要做成單例抽取出來

由于蘋果要求對ipv6做支持,所以還需要加上這段代碼:

_socket.IPv4PreferredOverIPv6=NO;// 設置支持IPV6

到此準備工作就做好啦。

連接socket

NSError*error =nil;

[self.socketconnectToHost:@"你的域名"onPort:@"你的端口"withTimeout:@"超時時間"error:&error];

如果連接成功,我們會收到socket連接成功的回調,我們可以在這里做心跳的處理,或者token的驗證等:

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

如果連接失敗,我們會收到失敗的回調,可以失敗里面做重連的操作

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

讀和寫

socket連接建立了,這個時候我們需要和后臺約定好協議格式進行通信,比如我們可以長度+真實數據的格式進行通信

// 將messageDict進行序列化(這里也可以使用kryo進行序列化,詳情見http://www.lxweimin.com/p/43f2a39ce1fd)NSData*contents = [NSJSONSerializationdataWithJSONObject:messageDict options:NSJSONWritingPrettyPrintederror:&error];if(error)

{

MyLog(@"%s--------error:%@",__func__,error);

}// 獲取長度intlen = (int)contents.length;NSData*lengthData = [NSDatadataWithBytes:&len length:sizeof(len)];// 發送長度[self.socketwriteData:lengthData withTimeout:-1tag:0];// 發送真實數據[self.socketwriteData:contents withTimeout:-1tag:0];// 讀取數據[self.socketreadDataWithTimeout:-1tag:0];

我們在向服務器寫完數據之后一定不要忘了調用讀方法,這樣才能收到從服務器那邊返回的數據,并且會收到讀的回調

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

在這個回調里面,我們可以用一個緩沖區來不斷接收我們收到的數據,并且在收到完整的數據后進行相應的處理

斷開socket連接

[self.socketdisconnect];

這樣子,socket的基本通信就告一段落啦

轉載自微信號【IT牛料】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 什么是GCDAsyncSocket GCDAsyncSocket 是用于 OS X 和 iOS 上的異步 Sock...
    double22single閱讀 689評論 1 0
  • 轉載:http://www.cocoachina.com/ios/20170615/19529.html 參考:h...
    F麥子閱讀 4,025評論 3 2
  • iPhone的標準推薦是CFNetwork 庫編程,其封裝好的開源庫是 cocoa AsyncSocket庫,用它...
    Ethan_Struggle閱讀 2,273評論 2 12
  • 相關概念: 單播、多播(組播)和廣播的區別 http://blog.csdn.net/wangerge/artic...
    三毛中隊長閱讀 4,192評論 0 1
  • 和大多數人一樣,我以前也不大讀書,總覺得時間和精力有限,讀完一本書要花很長時間,而且讀了書之后,生活和工作并沒有發...
    心水閱讀 557評論 0 8