GCDAsyncSocket的使用
关于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];
原文链接:https://blog.csdn.net/zhwezhwe/article/details/42246539