iOS#GCDAsyncSocket使用

作者: 践行者 | 来源:发表于2016-08-01 13:04 被阅读1195次

背景

最近在开发使用Socket,重新复习了socket基本知识,文章如下:

#Socket回顾学习笔记
UDP

GCDAsyncSocket使用

GCDAsyncSocket是CocoaAsyncSocket第三方库中的其中一个类,本文介绍的就是基于这一个类来做快速的socket通信开发,而且该库已经支持IPv4和IPv6.

对GCDAsyncSocket做了二次封装调用,一般情况下包含了建连、断开、重连、心跳、业务自定义请求等等。

创建socket

<pre>
在GCDAsyncSocket中提供了四种初始化的方法

  • (id)init;
  • (id)initWithSocketQueue:(dispatch_queue_t)sq;
  • (id)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq;
  • (id)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq socketQueue:(dispatch_queue_t)sq;

@property (atomic, weak, readwrite) id delegate;

if OS_OBJECT_USE_OBJC

@property (atomic, strong, readwrite) dispatch_queue_t delegateQueue;

else

@property (atomic, assign, readwrite) dispatch_queue_t delegateQueue;

endif

</pre>

sq是socket的线程,这个是可选的设置,如果你写null,GCDAsyncSocket内部会帮你创建一个它自己的socket线程,如果你要自己提供一个socket线程的话,千万不要提供一个并发线程,在频繁socket通信过程中,可能会阻塞掉,个人建议是不用创建

aDelegate就是socket的代理

dq是delegate的线程

必须要需要设置socket的代理以及代理的线程,否则socket的回调你无法得知。

socket链接

成功

<pre>

  • (BOOL)connectToHost:(NSString *)host
    onPort:(uint16_t)port
    withTimeout:(NSTimeInterval)timeout
    error:(NSError **)errPtr;

</pre>
host是主机地址,port是端口号

如果建连成功之后,会收到socket成功的回调,在成功里面你可以做你需要做的一些事情,比如心跳处理。

失败

<pre>

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

</pre>
在失败里面一般做了重连的操作

socket写数据

<pre>
[self.socket writeData:requestData withTimeout:-1 tag:0];
</pre>
imeout是超时时间,这个根据实际的需要去设置
写回调
<pre>

  • (void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)tag;
    </pre>

socket读数据

在写之后,需要再调用读方法,这样才能收到你发出请求后从服务器那边收到的数据
<pre>
[self.socketreadDataToData:[GCDAsyncSocket CRLFData] withTimeout:10 maxLength:500 tag:0]
</pre>
[GCDAsyncSocket CRLFData]这里是设置边界符,maxLength是设置你收到的请求数据内容的最大值
<pre>
-(void)socket:(GCDAsyncSocket)sock didReadData:(NSData)data withTag:(long)tag;
</pre>

socket断开链接

<pre>
[self.socket disconnect];
</pre>

如果作为服务端

监听端口

<pre>

NSError * error = nil;
[self.serverSocket acceptOnPort:[self.portTextField.text integerValue] error:&error];
</pre>

等待链接

<pre>

  • (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
    </pre>

相关文章

网友评论

    本文标题:iOS#GCDAsyncSocket使用

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