美文网首页
GCDAsyncSocket的使用

GCDAsyncSocket的使用

作者: KYM1988 | 来源:发表于2019-09-26 16:04 被阅读0次

    关于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


    相关文章

      网友评论

          本文标题:GCDAsyncSocket的使用

          本文链接:https://www.haomeiwen.com/subject/wrbvuctx.html