什么是GCDAsyncSocket
GCDAsyncSocket 是用于 OS X 和 iOS 上的异步 Socket 网络通讯包。提供了易用而且功能强大的异步套接字开发库
https://github.com/robbiehanson/CocoaAsyncSocket
基本使用
dispatch_queue_t queue = dispatch_queue_create("com.test.testsocket.setter", DISPATCH_QUEUE_SERIAL);
_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:queue socketQueue:nil];
dispatch_queue_t queue = dispatch_queue_create("com.test.testsocket.setter", DISPATCH_QUEUE_SERIAL);
_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:queue socketQueue:nil];
上面这两部就做好了初始化的操作,而且要注意,socket在整个项目中都会用到,所以要做成单例抽取出来
由于苹果要求对ipv6做支持,所以还需要加上这段代码:
_socket.IPv4PreferredOverIPv6 = NO; // 设置支持IPV6
到此准备工作就做好啦。
连接socket
NSError *error = nil;
[self.socket connectToHost:@"你的域名" 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.jianshu.com/p/43f2a39ce1fd)NSData *contents = [NSJSONSerialization dataWithJSONObject:messageDict options:NSJSONWritingPrettyPrinted error:&error];
if(error)
{
MyLog(@"%s--------error:%@",__func__,error);
}
// 获取长度int len = (int)contents.length;
NSData *lengthData = [NSData dataWithBytes:&len length:sizeof(len)];
// 发送长度
[self.socket writeData:lengthData withTimeout:-1 tag:0];
// 发送真实数据
[self.socket writeData:contents withTimeout:-1 tag:0];
// 读取数据
[self.socket readDataWithTimeout:-1 tag:0];
我们在向服务器写完数据之后一定不要忘了调用读方法,这样才能收到从服务器那边返回的数据,并且会收到读的回调
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
在这个回调里面,我们可以用一个缓冲区来不断接收我们收到的数据,并且在收到完整的数据后进行相应的处理
断开socket连接
[self.socket disconnect];
这样子,socket的基本通信就告一段落啦
转载自微信号【IT牛料】