关于断线重连的思路大概如下
当与服务器断开连接或网络出错时,先不要处理当前正在连接的socket,可能回应下当前UI的数据显示问题;
可以另起一个socket服务,与服务器尝试连接,当连接成功时,通知当前Socket进行重新连接
每六秒连接一次如果30秒仍未连接上则通知UI掉线,之后仍然继续连接,知道连接上为止
首先创建一个工具类,命名为:ReconnectControl.h
代码如下:
一、定义一些属性
@interface ReconnectControl ()<GCDAsyncSocketDelegate>
{
//用于通知UI断线
VoidBlock _UIBlock;
//用于通知socket连接成功
VoidBlock _successBlock;
//定时器
NSTimer *_reconnectTimer;
//socket
GCDAsyncSocket *_socket;
//重连次数
NSInteger _reconnectCount;
}
@end
二、实现方法
+(ReconnectControl *)shareControl
{
static ReconnectControl *control;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
control = [ReconnectControl new];
});
return control;
}
-(void)startReconnectBlock:(VoidBlock)noticeUI success:(VoidBlock)success
{
_UIBlock = noticeUI;
_successBlock = success;
_reconnectCount = 0;
[_reconnectTimer invalidate];
_reconnectTimer = [NSTimer scheduledTimerWithTimeInterval:6 target:self selector:@selector(reconnect) userInfo:nil repeats:true];
_status = Reconnecting;
}
-(void)reconnect
{
//当连续5次没有连接成功时通知UI显示断网提示
if (_reconnectCount == 5) {
_UIBlock();
}
_reconnectCount += 1;
[self connectHost];
}
//连接服务器
-(void)connectHost
{
_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
[_socket connectToHost:[Socket sharedInstance].socketHost onPort:[Socket sharedInstance].socketPort withTimeout:3 error:&error];
}
/**
连接成功后,断开Socket,通知正在等待连接的socket和UI
*/
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
_successBlock();
_status = ReconnecNone;
_reconnectCount = 0;
[_reconnectTimer invalidate];
[_socket disconnect];
_socket.delegate = nil;
NSLog(@"连接成功");
}
参考阅读:
代码文件: