什么是GCDAsyncSocket
GCDAsyncSocket 是用于 OS X 和 iOS 上的異步 Socket 網(wǎng)絡(luò)通訊包坦弟。提供了易用而且功能強(qiáng)大的異步套接字開發(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ì)用到挫掏,所以要做成單例抽取出來
由于蘋果要求對(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
讀和寫
socket連接建立了,這個(gè)時(shí)候我們需要和后臺(tái)約定好協(xié)議格式進(jìn)行通信剧蚣,比如我們可以長(zhǎng)度+真實(shí)數(shù)據(jù)的格式進(jìn)行通信
// 將messageDict進(jìn)行序列化(這里也可以使用kryo進(jìn)行序列化支竹,詳情見http://www.reibang.com/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ù)器寫完數(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ū)來不斷接收我們收到的數(shù)據(jù),并且在收到完整的數(shù)據(jù)后進(jìn)行相應(yīng)的處理
斷開socket連接
[self.socketdisconnect];
這樣子目尖,socket的基本通信就告一段落啦
轉(zhuǎn)載自微信號(hào)【IT牛料】