GCDAsyncSocket的使用

什么是GCDAsyncSocket

GCDAsyncSocket 是用于 OS X 和 iOS 上的異步 Socket 網(wǎng)絡(luò)通訊包。提供了易用而且功能強(qiáng)大的異步套接字開(kāi)發(fā)庫(kù)

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在整個(gè)項(xiàng)目中都會(huì)用到,所以要做成單例抽取出來(lái)

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

_socket.IPv4PreferredOverIPv6=NO;// 設(shè)置支持IPV6

到此準(zhǔn)備工作就做好啦。

連接socket

NSError*error =nil;

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

如果連接成功,我們會(huì)收到socket連接成功的回調(diào),我們可以在這里做心跳的處理,或者token的驗(yàn)證等:

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

如果連接失敗,我們會(huì)收到失敗的回調(diào),可以失敗里面做重連的操作

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

讀和寫(xiě)

socket連接建立了,這個(gè)時(shí)候我們需要和后臺(tái)約定好協(xié)議格式進(jìn)行通信,比如我們可以長(zhǎng)度+真實(shí)數(shù)據(jù)的格式進(jìn)行通信

// 將messageDict進(jìn)行序列化(這里也可以使用kryo進(jìn)行序列化,詳情見(jiàn)http://m.itdecent.cn/p/43f2a39ce1fd)NSData*contents = [NSJSONSerializationdataWithJSONObject:messageDict options:NSJSONWritingPrettyPrintederror:&error];if(error)

{

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

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

我們?cè)谙蚍?wù)器寫(xiě)完數(shù)據(jù)之后一定不要忘了調(diào)用讀方法,這樣才能收到從服務(wù)器那邊返回的數(shù)據(jù),并且會(huì)收到讀的回調(diào)

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

在這個(gè)回調(diào)里面,我們可以用一個(gè)緩沖區(qū)來(lái)不斷接收我們收到的數(shù)據(jù),并且在收到完整的數(shù)據(jù)后進(jìn)行相應(yīng)的處理

斷開(kāi)socket連接

[self.socketdisconnect];

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

轉(zhuǎn)載自微信號(hào)【IT牛料】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是GCDAsyncSocket GCDAsyncSocket 是用于 OS X 和 iOS 上的異步 Sock...
    double22single閱讀 715評(píng)論 1 0
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20170615/19529.html 參考:h...
    F麥子閱讀 4,144評(píng)論 3 2
  • iPhone的標(biāo)準(zhǔn)推薦是CFNetwork 庫(kù)編程,其封裝好的開(kāi)源庫(kù)是 cocoa AsyncSocket庫(kù),用它...
    Ethan_Struggle閱讀 2,367評(píng)論 2 12
  • 相關(guān)概念: 單播、多播(組播)和廣播的區(qū)別 http://blog.csdn.net/wangerge/artic...
    三毛中隊(duì)長(zhǎng)閱讀 4,283評(píng)論 0 1
  • 和大多數(shù)人一樣,我以前也不大讀書(shū),總覺(jué)得時(shí)間和精力有限,讀完一本書(shū)要花很長(zhǎng)時(shí)間,而且讀了書(shū)之后,生活和工作并沒(méi)有發(fā)...
    心水閱讀 670評(píng)論 0 9

友情鏈接更多精彩內(nèi)容