GCDAsyncSocket的使用

什么是GCDAsyncSocket

GCDAsyncSocket 是用于 OS X 和 iOS 上的异步 Socket 网络通讯包。提供了易用而且功能强大的异步套接字开发库

https://github.com/robbiehanson/CocoaAsyncSocket

基本使用

dispatch_queue_tqueue = dispatch_queue_create("com.test.testsocket.setter", DISPATCH_QUEUE_SERIAL);

_socket = [[GCDAsyncSocket alloc] initWithDelegate:selfdelegateQueue:queue socketQueue:nil];

上面这两部就做好了初始化的操作,而且要注意,socket在整个项目中都会用到,所以要做成单例抽取出来

由于苹果要求对ipv6做支持,所以还需要加上这段代码:

_socket.IPv4PreferredOverIPv6=NO;// 设置支持IPV6

到此准备工作就做好啦。

连接socket

NSError*error =nil;

[self.socketconnectToHost:@"你的域名"onPort:@"你的端口"withTimeout:@"超时时间"error:&error];

如果连接成功,我们会收到socket连接成功的回调,我们可以在这里做心跳的处理,或者token的验证等:

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

如果连接失败,我们会收到失败的回调,可以失败里面做重连的操作

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

读和写

socket连接建立了,这个时候我们需要和后台约定好协议格式进行通信,比如我们可以长度+真实数据的格式进行通信

// 将messageDict进行序列化(这里也可以使用kryo进行序列化,详情见http://www.jianshu.com/p/43f2a39ce1fd)NSData*contents = [NSJSONSerializationdataWithJSONObject:messageDict options:NSJSONWritingPrettyPrintederror:&error];if(error)

{

MyLog(@"%s--------error:%@",__func__,error);

}// 获取长度intlen = (int)contents.length;NSData*lengthData = [NSDatadataWithBytes:&len length:sizeof(len)];// 发送长度[self.socketwriteData:lengthData withTimeout:-1tag:0];// 发送真实数据[self.socketwriteData:contents withTimeout:-1tag:0];// 读取数据[self.socketreadDataWithTimeout:-1tag:0];

我们在向服务器写完数据之后一定不要忘了调用读方法,这样才能收到从服务器那边返回的数据,并且会收到读的回调

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

在这个回调里面,我们可以用一个缓冲区来不断接收我们收到的数据,并且在收到完整的数据后进行相应的处理

断开socket连接

[self.socketdisconnect];

这样子,socket的基本通信就告一段落啦

转载自微信号【IT牛料】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是GCDAsyncSocket GCDAsyncSocket 是用于 OS X 和 iOS 上的异步 Sock...
    double22single阅读 689评论 1 0
  • 转载:http://www.cocoachina.com/ios/20170615/19529.html 参考:h...
    F麦子阅读 4,041评论 3 2
  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 2,277评论 2 12
  • 相关概念: 单播、多播(组播)和广播的区别 http://blog.csdn.net/wangerge/artic...
    三毛中队长阅读 4,197评论 0 1
  • 和大多数人一样,我以前也不大读书,总觉得时间和精力有限,读完一本书要花很长时间,而且读了书之后,生活和工作并没有发...
    心水阅读 570评论 0 8