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数据粘包问题

代码文件:

 代码文件



  • 0
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 0
    评论
<p class="MsoNormal"><span style="font-family: 宋体;">(</span>1<span style="font-family: 宋体;">)</span>HTML5 WebSocket<span style="font-family: 宋体;">、异常重连、心跳检测;</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">(</span>2<span style="font-family: 宋体;">)</span>SockJS<span style="font-family: 宋体;">、</span>Stomp<span style="font-family: 宋体;">、</span>RabbitMQ Stomp<span style="font-family: 宋体;">消息代理;</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">(</span>3<span style="font-family: 宋体;">)分别用</span>Nginx<span style="font-family: 宋体;">和</span>Spring Cloud Gateway<span style="font-family: 宋体;">实现多实例负载均衡;</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">(</span>4<span style="font-family: 宋体;">)可靠消息推送(</span>Stomp<span style="font-family: 宋体;">持久化队列、客户端</span>ACK<span style="font-family: 宋体;">确认机制);</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">(</span>5<span style="font-family: 宋体;">)</span>Java<span style="font-family: 宋体;">原生、</span>Stomp<span style="font-family: 宋体;">客户端实现(非浏览器客户端);</span></p> <p class="MsoNormal"><span style="font-family: 宋体;">(</span>6<span style="font-family: 宋体;">)</span>Websocket<span style="font-family: 宋体;">拦截器结合</span> Spring security<span style="font-family: 宋体;">、</span>jwt token<span style="font-family: 宋体;">认证授权。</span></p>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

吴彦祖666

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值