最近应项目需求 对接了webscoket 对接之后发现 webscoket并不是那么难反而很简单
1,cocoapods 导入webscoket
pod 'SocketRocket'
#import "SocketRocket.h"
//
// 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