您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页ios菜鸟线程,TCP通讯大作战之----心跳包timeout了

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

来源:二三娱乐

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

当然后来发现有网络知识对于解决我这个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;
            }
            
        });

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

这样的代码的前提

 @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.因为队列都丢失了.

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务