iOS之 webscoket 的使用

xiaoxiao2021-02-28  10

最近应项目需求  对接了webscoket  对接之后发现 webscoket并不是那么难反而很简单 

1,cocoapods 导入webscoket  

pod 'SocketRocket'

2,引入

#import "SocketRocket.h"

3,开始接入   我就直接粘贴代码

//

//  ViewController.m

//  WebscoketText

//

//  Created by 冯闯 on 2018/3/8.

//  Copyright © 2018年 冯闯. All rights reserved.

//

#import "ViewController.h"

#import "SocketRocket.h"

#define kWebscoketurl @"ws://101.132.27.239:9090//websocket"

/*

 _socket.readyState//webscoket 的连接状态  只有连接成功之后才能发送消息给后台  否则直接奔溃

 //判断scoket是否已经打开

 SR_CONNECTING   = 0, 正在连接

 SR_OPEN         = 1, 已经打开

 SR_CLOSING      = 2, 正在关闭

 SR_CLOSED       = 3, 已经关闭

 

 */

@interface ViewController ()<SRWebSocketDelegate>

{

    SRWebSocket *_socket;

    NSTimeInterval reConnectTime;

    NSTimer * timer;

}

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    SRWebSocket *socket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:kWebscoketurl]]];

    socket.delegate = self;    // 实现这个 SRWebSocketDelegate 协议啊

    [socket open];

}

#pragma mark --- 连接成功会调用这个代理方法

- (void)webSocketDidOpen:(SRWebSocket *)webSocket

{

这个发送给后台的内容是与后台约定好的  后台需要什么  你传什么就可以了

    reConnectTime = 0;

    NSLog(@"连接成功,可以立刻登录你公司后台的服务器了,还有开启心跳");

    NSDictionary *dic = @{@"mobileType":@"1",@"userId":@"123456",@"clientUUID":@"nihao",@"phoneToken":@"",@"deptCode":@"",@"courtCode":@""};

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];

    NSString *jsonstr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    [webSocket send:jsonstr];  //给后台发送信息

}

#pragma mark ---  连接失败会调用这个方法,看 NSLog 里面的东西

- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error

{

    NSLog(@"%@",error);

    //    NSLog(@"连接失败,这里可以实现掉线自动重连,要注意以下几点");

    //    NSLog(@"1.判断当前网络环境,如果断网了就不要连了,等待网络到来,在发起重连");

    //    NSLog(@"2.判断调用层是否需要连接,例如用户都没在聊天界面,连接上去浪费流量");

    //    NSLog(@"3.连接次数限制,如果连接失败了,重试10次左右就可以了,不然就死循环了。或者每隔1,2,4,8,10,10秒重连...f(x) = f(x-1) * 2, (x=5)");

    [self reConnect];

}

#pragma mark ---  连接关闭调用这个方法,注意连接关闭不是连接断开,关闭是 [socket close] 客户端主动关闭,断开可能是断网了,被动断开的。

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean

{

    NSLog(@"连接断开,清空socket对象,清空该清空的东西,还有关闭心跳!");

    reConnectTime = 0;

    [self reConnect];

    

    

}

#pragma mark ---  .收到服务器发来的数据会调用这个方法

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message

{

    NSLog(@"%@",message);

  

}

#pragma mark --- 重连机制

- (void)reConnect

{

    [_socket close];

    if (reConnectTime > 512) {

        //您的网络状况不是很好,请检查网络后重试

        return;

    }

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(reConnectTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        _socket = nil;

        _socket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:kWebscoketurl]]];

        _socket.delegate = self;    // 实现这个 SRWebSocketDelegate 协议啊

        [_socket open];

        NSLog(@"重连");

    });

    //重连时间2的指数级增长

    if (reConnectTime == 0) {

        reConnectTime = 2;

    }else{

        reConnectTime *= 2;

        NSLog(@"%f",reConnectTime);

    }

}

本文添加了重连机制  无论是后台关闭  还是网络断掉  都会重新连接   QQ 2869953811   

转载请注明原文地址: https://www.6miu.com/read-2150281.html

最新回复(0)