zoukankan      html  css  js  c++  java
  • <原>AsyncSocket使用心得

    首先 下载源代码

    倒入runloop文件夹下的 四个文件即可

    AsyncSocket *socket=[[AsyncSocketalloc]initWithDelegate:self];

     NSError *error;

     [socket  connectToHost:h onPort:p withTimeout:-1error:&error ];

     

     

    然后实现一些Delegate方法

    A:- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port;
    B:- (void)onSocketDidSecure:(AsyncSocket *)sock;
    C:- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;
    D:- (void)onSocketDidDisconnect:(AsyncSocket *)sock;
    E:- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

    监听网络操作

    如果链接成功会调用A   

    如果我们想读取数据  就在A方法中  加入[socket readDataWithTimeout:-1 tag:0];  当收到数据的时候  会调用E  当调用E之后 我们的这个读取请求就完成了

    不再监听网络, 若想一直监听网络  在E中 也加入[socket readDataWithTimeout:-1 tag:0]; 

    这个库若想监听网络,必须先设置[socket readDataWithTimeout:-1 tag:0];这里面的tag很重要。如果你写的时候用的tag与读的不相同,那么永远在回调的地方没有回复。
    当读的时候,需要判断长度是否足够,如果不够需要再次设置[socket readDataWithTimeout:-1 tag:0];
    如果你需要保持这条链路,就不要用它的超时,因为默认超时,会断开连接。你再超时回调处,再次设置时间,也只是延长等待时间,到点仍是断链。

    cilent向主机发送命令,每次发送一条后 主动断开

    connectToHost:这个方法会返回一个bool  但是每次都返回yes   原因是这个方法yes  与no  表示 是否尝试着去链接host  并不代表是否链接成功

    所以要想知道是否链接成功  要看是否调用了A方法

    如果我们写如下的代码 

    -(void)xxxxxxxxpressed:(xxx)xxxx{

     [socket  connectToHost:h onPort:p withTimeout:-1error:&error ];

     [socket  writeData:currentConmandwithTimeout:-1tag:button.tag];

    [socket disconnectAfterWriting];

    }

    每次事件发生的时候  进行链接  并且马上发送数据,然后 等Writing结束后  撤销链接  这样在100%能链接上的情况下是没有问题的

    但是 当主机出现问题  链接不上的时候, connectToHost:之后 马上写入数据,但是这个写入请求永远不会完成,所以之后的disconnectAfterWriting

    一直会等待下去不执行,则这个connect仍然处于链接失败 状态。

    当下一次事件发生的时候,会再次链接,这时程序崩溃,错误信息是告诉我们  必须先disconnect之后 才能再次链接

    原因是 connect失败导致写入无法完成,所以disconnectAfterWriting 也就无法完成

    解决办法 在 这个方法的最开始 加入几句代码

     [socketsetDelegate:nil];

            [socket disconnect];

            socket=nil;

    然后每次都重新初始化一次socket即可

    详细内容参考  官方文档https://github.com/robbiehanson/CocoaAsyncSocket/wiki/Reference_GCDAsyncSocket#wiki-isConnected

     

     

  • 相关阅读:
    求连续序列的最大子序列和
    并查集
    分治法求最近点对
    从n个数里面选择m个数
    AcWing
    AcWing
    AcWing
    AcWing
    2017-2018 ACM-ICPC Latin American Regional Programming Contest
    2016-2017 7th BSUIR Open Programming Contest. Semifinal
  • 原文地址:https://www.cnblogs.com/bucengyongyou/p/2743523.html
Copyright © 2011-2022 走看看