GCDAsyncSocket的使用

转载 2016年08月30日 15:43:13
什么是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];

上面这两部就做好了初始化的操作,而且要注意,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牛料】


介绍GCDAsyncSocket

原文地址:https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Intro_GCDAsyncSocket GCDAsyncSocket is...

iOS基础之GCDAsyncSocket

最近工作需要接触了iOS网络通信这一块内容,用的是github上的一个第三方库:GCDAsyncSocket。 这篇文章记录了我在学习这个第三方库过程中的一些理解和体会...

GCDAsyncSocket TCP 建立 socket 连接

最近项目中有用到,真的是各种坑,所以总结了一下,希望对你们有帮助,socket TCP 建立连接方式...

【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)

Socket描述了一个IP、端口对。它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息。所以,Socket一定包含了通信的双发,即客户端(Clien...

<iOS开发>之CocoaAsyncSocket使用

本文介绍了CocoaAsyncSocket库中GCDAsyncSocket类的使用、粘包处理以及时间延迟测试.一.CocoaAsyncSocket介绍CocoaAsyncSocket中主要包含两个类:...

GCDAsyncSocket 连接host ipv6实现

公司ios开发因为工作量不大,所以不准备招人,让我负担一下…开发Android接近3年,尝试一下也不错。所以最近一个月一直在恶补ios相关基础。又因为公司是做sdk的,为了兼容所以需要掌握oc而不是s...

GCDAsyncSocket的使用

关于socket,网络上大部分都是用的asyncsokcet,这次我们来说说另外一个,基于GCD的GCDAsyncsocket 两者的区别,最大的就是一个是基于runloop,一个是基于GCD的。另...

GCDAsyncSocket 接收不到数据

GCDAsyncSocket 接收不到数据

GCDAsyncSocket不能读取数据的原因

按照网上找到的例子,尝试做简单的TCP发送和接收。 结果发现事实并不是那么回事,为什么?到stack overflow里看到一个原因说有可能delegate被系统自动释放掉,这样就不会有delega...

(六十五)iOS的socket实现(GCDAsyncSocket)

本文介绍使用GCDAsyncSocket来实现iOS端的socket,有关简易服务端的代码已经在上一篇文章中提到,这里不再赘述,将直接介绍如何实现客户端。 首先下载CocoaAsyncSocket框...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCDAsyncSocket的使用
举报原因:
原因补充:

(最多只允许输入30个字)