美文网首页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了

    为什么说菜鸟,因为菜鸟就是菜鸟,没有通讯基础,非科班出身,没有基本的网络知识. 当然后来发现有网络知识对于解决我这...

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

    纸上得来终觉浅,绝知此事要躬行!复制在开头原地址:http://www.cnblogs.com/zhidao-ch...

  • 移动端心跳包

    移动端心跳包 TCP的心跳机制 TCP协议,本身拥有一个KeepAlive机制,既然有了心跳机制,为什么还要在应用...

  • iOS即时通讯,资料整理

    不定时更新 参考资料: iOS即时通讯,从入门到“放弃”? 为什么说基于TCP的移动端IM仍然需要心跳保活? 移动...

  • 聊天室

    TCP 視窗聊天版本—cnblogs—windows 心跳机制 闲说HeartBeat心跳包和TCP协议的Keep...

  • 设备离线检测方案设计

    物联网设备通过某种通讯方式,与服务器进行链接。 我们通过心跳包来确定设备是否在线。 有些设备用的是 TCP/IP...

  • 网络基本功(二十三):Wireshark抓包实例诊断TCP连接问

    介绍 前文论述了TCP基础知识,从本节开始,通过TCP抓包实例来诊断TCP常见问题。 TCP进程通讯时,双方打开连...

  • iOS Wireshark抓包

    级别:★☆☆☆☆标签:「Wireshark for mac」「iOS TCP抓包」「iOS UDP抓包」作者: X...

  • 黏包的处理

    socket通讯时,tcp不会丢包,会黏包;udp不会黏包,会丢包 tcp发生黏包的原因有二: 1、当一个数据发送...

  • tcp长连接、心跳包

    长连接 TCP经过三次握手建立连接,长连接是指不管有无数据包的发送都长期保持建立的连接;有长连接自然也有短连接,短...

网友评论

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

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