您的位置:首页 > 理论基础 > 计算机网络

GCDAsyncSocket的使用

2014-12-29 22:15 453 查看
关于socket,网络上大部分都是用的asyncsokcet,这次我们来说说另外一个,基于GCD的GCDAsyncsocket

两者的区别,最大的就是一个是基于runloop,一个是基于GCD的。另外,GCD是可以直接写代码让其在后台运行的。

socket在程序中要保持有且仅有一个,所以要创建一个单例,实例化出来.上菜,如图



图中展示了两种创建单例的形式,任选其一就好了

然后是链接服务器


这里创建了一个socket,并对其进行设置了代理和所运行的线程

链接服务器其实就是一句话的事情,就涵盖了socket链接时的三次握手,简单粗暴,点赞.

这里的bool返回的是能否链接,成功表示可以链接,失败表示由于设备除了问题导致不能链接。

其中有一个超时时间,只有一种数值对他有效果,就是大于0的时候,这里设置成-1是没效果的,意思是如果给他一个链接超时时间,如果在这个时间内仍不能连上,则调用代理

-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err

不过此时的err为空
如果链接成功则调用另外的代理

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port

需要注意的是在链接成功的代理方法里面一定要写上如下的句子,否则是接收不到消息的,这个是读取消息用的

    [sock readDataWithTimeout:3
tag:0];
这里面涉及到了两个值,其一超时时间,其二tag

超时时间好理解,如果在超时时间内完成,则无影响,如果到达超时时间还未接收到数据,则调用代理

-(NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag
elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length
没有问题的话,此时应该已经连接上了服务器,如果你们服务器写的好的话,应该不会断了
此时如果有收到消息的话,会调用这个代理

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

完成接收数据,再来说说发送数据
发送数据也很简单,就是一句话

    [_socket
writeData:data withTimeout:3
tag:1];

同样,除了data是需要发送的数据外,也包含了两个值,超时时间和tag,这个超时时间一样,当到达超时时间后会调用这个代理

-(NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag
elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length

此时就可以与服务器畅快的进行数据交互了
如果想断开怎么办
简单,也是一句话

    [_socket
disconnect];但此时也会调用

-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
这个代理,不过此时的err就不为空了
还可以来一个在运行中检测是否还在连接,一句话搞定

    BOOL state = [_socket
isConnected];

是不是很简单?开始玩转socket吧,下次有机会说说socket的长连接,还有一些关于socket的趣事
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 网络 gcd ios