zoukankan      html  css  js  c++  java
  • 基于Facebook开源框架SocketRocket的即时通讯

      SocketRocket 介绍:

      SocketRock 是 Facebook 开源的框架,基于 WebSocket 客户端类库,适用于 iOS、Mac OS、tv OS。GitHub 传送门:https://github.com/facebook/SocketRocket

      安装:pod 'SocketRocket'

      也可以拖入文件 SocketRocket:

      

      引入框架:

    • libicucore.dylib
    • CFNetwork.framework
    • Security.framework
    • Foundation.framework

      SocketRocket 初始化:

    - (void)initSocket
    {
        if (webSocket) {
            return;
        }
        webSocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:ServerURL]];
        webSocket.delegate = self;
        
        //  设置代理线程queue
        NSOperationQueue * queue=[[NSOperationQueue alloc]init];
        queue.maxConcurrentOperationCount=1;
        [webSocket setDelegateOperationQueue:queue];
        
        //  连接
        [webSocket open];
        
    }

      

    // 初始化心跳
    - (void)initHeartBeat
    {
        dispatch_main_async_safe(^{
            [self destroyHeartBeat];
            
            __weak typeof (self) weakSelf = self;
            //心跳设置为3分钟,NAT超时一般为5分钟
            heartBeat = [NSTimer scheduledTimerWithTimeInterval:3*60 repeats:YES block:^(NSTimer * _Nonnull timer) {
                NSLog(@"heart");
                //和服务端约定好发送什么作为心跳标识,尽可能的减小心跳包大小
                [weakSelf sendMsg:@"heart"];
            }];
            [[NSRunLoop currentRunLoop] addTimer:heartBeat forMode:NSRunLoopCommonModes];
        })
    }
    
    // 取消心跳
    - (void)destroyHeartBeat
    {
        dispatch_main_async_safe(^{
            if (heartBeat) {
                [heartBeat invalidate];
                heartBeat=nil;
            }
        })
    }
    
    //  重连机制
    - (void)reConnect
    {
        [self disConnect];
        
        //  超过一分钟就不再重连   之后重连5次  2^5=64
        if (reConnectTime>64) {
            return;
        }
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(reConnectTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            webSocket=nil;
            [self initSocket];
        });
        
        //   重连时间2的指数级增长
        if (reConnectTime == 0) {
            reConnectTime =2;
        } else {
            reConnectTime *=2;
        }
    }

      代理方法:

    #pragma mark - SRWebScokerDelegate
    - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
    {
        NSLog(@"服务器返回的信息:%@",message);
    }
    
    - (void)webSocketDidOpen:(SRWebSocket *)webSocket
    {
        NSLog(@"连接成功");
        //   连接成功 开始发送心跳
        [self initHeartBeat];
    }
    
    //  open失败时调用
    - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
    {
        NSLog(@"连接失败。。。。。%@",error);
        //  失败了去重连
        [self reConnect];
    }
    
    //  网络连接中断被调用
    - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
    {
        
        NSLog(@"被关闭连接,code:%ld,reason:%@,wasClean:%d",code,reason,wasClean);
        
        //如果是被用户自己中断的那么直接断开连接,否则开始重连
        if (code == DisConnectTypeByUser) {
            [self disConnect];
        } else {
            
            [self reConnect];
        }
        //断开连接时销毁心跳
        [self destroyHeartBeat];
    }
    
    //sendPing的时候,如果网络通的话,则会收到回调,但是必须保证ScoketOpen,否则会crash
    - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload
    {
        NSLog(@"收到pong回调");
        
    }

      

  • 相关阅读:
    PHP实现bitmap算法
    c++高性能web框架drogon入门教程五:实例小项目,web和api实例代码
    c++高性能web框架drogon入门教程四,orm使用,csp使用
    c++高性能web框架 drogon入门教程三 控制器和数据库客户端使用
    c++高性能web框架drogon入门教程二 windows10下安装drogon,配合vscoede搭建开发环境
    关于tiobe编程语言排行榜的开发语言排名有什么实际作用吗?
    Effective C++的50条建议
    php-cli命令行选项
    php调用kafka消息队列
    php调用rabbitmq实现订单消费队列,和延时消费队列
  • 原文地址:https://www.cnblogs.com/ZachRobin/p/9361293.html
Copyright © 2011-2022 走看看