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];


是不是很简单?开始玩转socket吧,下次有机会说说socket的长连接,还有一些关于socket的趣事



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值