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回调");
        
    }

      

  • 相关阅读:
    ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
    ASP.NET Web API 框架研究 核心的消息处理管道
    ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道
    ASP.NET Web API 框架研究 ASP.NET Web API 路由
    ASP.NET Web API 框架研究 ASP.NET 路由
    ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
    MVVM模式
    RESTful Web API 理解
    C# 函数式编程及Monads.net库
  • 原文地址:https://www.cnblogs.com/ZachRobin/p/9361293.html
Copyright © 2011-2022 走看看