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
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java socket断线重连是指当网络连接异常开后,重建网络连接,保证数据的准确传递。实现 java socket断线重连需要考虑以下几个方面: 第一个方面是异常断线的检测。Java socket建立的连接一旦因为网络不稳定等原因掉,就会抛出SocketException异常。可以通过捕获该异常来检测连接的异常开情况。 第二个方面是断线重连的实现。可以先关闭当前Socket对象,并重新建立一个Socket对象连接到相同的目标IP和端口上,使用while循环在代码中封装,达到断线自动重连的效果。 第三个方面是防止频繁重连。如果网络环境不稳定,频繁的重连对于目标服务器负担过大,需要采取一些措施来避免频繁重连造成的问题,例如设置重连间隔时间,减小重连次数等。 以上是实现java socket断线重连的主要思路和注意事项。在实际项目中,还需要根据具体情况进行具体的实现,例如:根据服务器状态信息自适应地调整重连策略等等。需要注意的是,网络连接是一个非常复杂的问题断线重连只是一种解决方案,需要综合考虑各种因素,才能保证连接的稳定性和数据的完整传输。 ### 回答2: Java Socket断线重连是指在网络通讯过程中,由于网络不稳定或者其他原因,Socket连接开后,能够自动重连并恢复通讯的一种技术。 在Java中,可以通过编写客户端和服务端代码,建立Socket连接,并对连接进行监控。当连接开后,客户端或者服务端会收到一个异常提示,并可以在异常处理中加入重连代码,使得Socket能够重新建立连接并继续通讯。 要实现Socket断线重连功能,需要按以下步骤进行: 1. 在异常处理中获取Socket连接对象并关闭该连接。 2. 在循环中进行重连操作,直到连接成功或者超过最大重连次数。 3. 等待若干秒后再次尝试连接。 以下是Java中Socket断线重连的示例代码: ```java public void connect() { boolean isConnected = false; int attempts = 0; while (!isConnected && attempts < 3) { try { socket = new Socket("localhost", 8080); isConnected = true; } catch (IOException e) { attempts++; System.out.println("Connection attempt " + attempts + " failed"); try { Thread.sleep(5000); } catch (InterruptedException ie) { System.out.println("InterruptedException occurred: " + ie.getMessage()); } } } if (isConnected) { System.out.println("Successfully connected to server"); } else { System.out.println("Failed to connect to server"); } } ``` 以上代码会尝试连接“localhost”服务器8080端口,并在连接失败后进行重连操作,重连3次后若仍然无法成功连接则退出。在每次重连前,程序会等待5秒钟。通过此方法,可以让Socket断线重连更加稳定可靠地工作。 ### 回答3: Java中的Socket是一种通信机制,用于在网络上发送和接收数据。在网络通信中,由于网络环境不稳定,经常会出现连接开的情况。一旦连接开,我们就需要进行重新连接,让程序继续工作。下面是Java Socket断线重连的详细介绍。 Java Socket断线重连需要实现以下几个步骤: 1.创建并打开Socket连接 在Java中,可以使用InetSocketAddress和Socket对象来创建和打开Socket连接。 2.设置Socket的属性 在Java Socket编程中,可以使用Socket类提供的方法来设置Socket的属性。其中,setSoTimeout()方法可以设置Socket的超时时间,如果连接在规定的时间内没有成功建立,就会发生连接错误并抛出异常。 3.检查Socket状态 在Java Socket编程中,可以使用Socket类提供的isClosed()和isConnected()方法分别检查Socket连接是否已关闭和是否已连接。 4.实现Socket断线重连 如果Socket连接被中,需要使用try-catch语句块来捕获异常,并在捕获异常后尝试重新连接。可以使用while循环来实现Socket重连操作。 5.关闭Socket连接 在Java Socket编程中,可以使用Socket类提供的close()方法来关闭Socket连接。 需要注意的是,在Java Socket断线重连的过程中,需要充分考虑网络环境不稳定的情况,避免频繁重连造成程序系统负荷过大的情况。同时,需要充分测试程序的异常处理和重连功能,确保程序可以正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值