美文网首页IOSbug高级网络IOS
ios菜鸟线程,TCP通讯大作战之----心跳包timeout了

ios菜鸟线程,TCP通讯大作战之----心跳包timeout了

作者: 司马捷 | 来源:发表于2015-07-07 17:48 被阅读2295次

    为什么说菜鸟,因为菜鸟就是菜鸟,没有通讯基础,非科班出身,没有基本的网络知识.

    当然后来发现有网络知识对于解决我这个bug,也是'然并卵'.

    写在开头,对于自己的反省,我一直很想知道优秀的程序员是怎样写代码的,为什么我就是菜鸟?

    这个bug,赤裸裸的扇了我一个巴掌,然而我还没有要改的意思.我总结出来这样一句话,"犯贱的人,绝对不是优秀的程序员."

    下面整理下,虽然很多代码,和最后解决bug问题,没有多大关系,就当总结一下咯.
    1.首先介绍下在队列中添加一个线程去doping.也就是做心跳包了.(这个不是我写的,有人说用定时器写会简单些)

     NSInvocationOperation *pingop =
    [[NSInvocationOperation alloc] initWithTarget:self
                                         selector:@selector(doPing)
                                           object:nil];
    [gQueue_ addOperation:pingop];
    [pingop release];
    

    2.介绍下具体的doping 方法

    - (void)doPing {
    float interval = [Settings instance].appInfo.pingInterval;
    const float wait = 0.5f;
    
    while (connected_) {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
        @try {
            float past = 0.0;
            while (connected_ && past < interval) {
                [NSThread sleepForTimeInterval:wait];
                past += wait;
            }
            if (!connected_) {
                break;
            }
            dispatch_barrier_async(_serialQueue, ^{
                if ([self sendPing] != kReturnNormal) {
                    
                    //设置断开连接,统一交到loop去处理
                    connected_ = NO;
                }
                
            });
       
        } @finally {
            [pool release];
        }        
    }
    

    }

    3.开始说关键的地方了.上面这个代码

    dispatch_barrier_async(_serialQueue, ^{
                if ([self sendPing] != kReturnNormal) {
                    //设置断开连接,统一交到loop去处理
                    connected_ = NO;
                }
                
            });
    

    本身代码就属于次线程,次线程中又添加了一个串行化队列.为什么要用串行化队列呢?
    1.什么是串行化队列?
    dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
    学习地址:http://www.cnblogs.com/stoic/archive/2012/09/25/2785184.html

    因为后面防止发送数据,使用同一个方法,防止数据冲突.

    这样的代码的前提

     @property (nonatomic,strong)dispatch_queue_t serialQueue;//串行化队列
    

    我之前是

    @interface CommClient() {   
    
    dispatch_queue_t  _serialQueue;
    }
    

    _serialQueue的创建.

    _serialQueue = dispatch_queue_create("com.navensoft.eric", NULL);
    

    我这个队列的属性的设置Strong,还是在interface 中添加,直接导致我的心跳包后面timeout.因为队列都丢失了.

    相关文章

      网友评论

        本文标题:ios菜鸟线程,TCP通讯大作战之----心跳包timeout了

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