Socket 断线重连问题

关于断线重连的思路大概如下

当与服务器断开连接或网络出错时,先不要处理当前正在连接的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(@"连接成功");
}


参考阅读:

 利用GCDAsyncSocket实战经验

  处理Socket数据粘包问题

代码文件:

 代码文件



©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值