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