GCDAsyncSocket的使用

什么是GCDAsyncSocket

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

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;// 設(shè)置支持IPV6

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

連接socket

NSError*error =nil;

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

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

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

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

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

讀和寫

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

// 將messageDict進(jìn)行序列化(這里也可以使用kryo進(jìn)行序列化,詳情見http://www.itdecent.cn/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)];// 發(fā)送長度[self.socketwriteData:lengthData withTimeout:-1tag:0];// 發(fā)送真實數(shù)據(jù)[self.socketwriteData:contents withTimeout:-1tag:0];// 讀取數(shù)據(jù)[self.socketreadDataWithTimeout:-1tag:0];

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

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

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

斷開socket連接

[self.socketdisconnect];

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

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

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

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

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