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