关于socket,网络上大部分都是用的asyncsokcet,这次我们来说说另外一个,基于GCD的GCDAsyncsocket
两者的区别,最大的就是一个是基于runloop,一个是基于GCD的。另外,GCD是可以直接写代码让其在后台运行的。
socket在程序中要保持有且仅有一个,所以要创建一个单例,实例化出来.上菜,如图
图中展示了两种创建单例的形式,任选其一就好了
然后是链接服务器
这里创建了一个socket,并对其进行设置了代理和所运行的线程
链接服务器其实就是一句话的事情,就涵盖了socket链接时的三次握手,简单粗暴,点赞.
这里的bool返回的是能否链接,成功表示可以链接,失败表示由于设备除了问题导致不能链接。
其中有一个超时时间,只有一种数值对他有效果,就是大于0的时候,这里设置成-1是没效果的,意思是如果给他一个链接超时时间,如果在这个时间内仍不能连上,则调用代理
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
[sock readDataWithTimeout:3 tag:0];
-(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];
-(NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length
如果想断开怎么办
简单,也是一句话
[_socket disconnect];但此时也会调用
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
BOOL state = [_socket isConnected];