什么是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牛料】