iOS Socket网络编程

在网络编程心跳机制,使用的是objective-c的消息循环机制,每隔25秒重新连接,连接失败后默认重新连接次数5次,连接每隔(arc4random() % 10) + 1.5 秒(随机1.5~11.5秒)

接收到服务器数据后:1、重置心跳时间,计时25秒后重新连接服务器 2、发送心跳序列号给服务器

- (void)connect {
    
    if (self.isConnecting || ![HHAppContext sharedInstance].isReachable) { return; }
    
    BOOL isConnectd = self.socket.isConnected;
    [self disconnect];
    self.isConnecting = YES;
    int64_t delayTime = isConnectd ? (arc4random() % 10) + 1.5 : 1;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayTime * NSEC_PER_SEC)), dispatch_get_global_queue(2, 0), ^{
       
        [self performSelector:@selector(connectOnSocketThread) onThread:self.socketThread withObject:nil waitUntilDone:YES];
    });
}


- (void)configSocketThread {
    
    if (self.socketThread == nil) {
        self.socketThread = [NSThread currentThread];
        [[NSRunLoop currentRunLoop] addPort:self.machPort forMode:NSDefaultRunLoopMode];
    }
    while (self.keepRuning) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
    
    [[NSRunLoop currentRunLoop] removePort:self.machPort forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
    [self.socketThread cancel];
    self.socket = nil;
    self.service = nil;
    self.machPort = nil;
    self.socketThread = nil;
    self.delegateQueue = nil;
}

 

方法介绍

/**
 在主线程上执行指定的方法,使用默认的模式(NSDefaultRunLoopMode)
 默认的模式指:主线程中的方法进行排队,是一个循环队列,并且循环执行。
这个函数表示在主线程上执行方法,YES表示需要阻塞主线程,直到主线程将我们的代码块执行完毕。

 @param aSelector 要在主线程执行的方法,该方法不能有返回值,并且只能有一个参数。
 @param arg 要传递的参数,如果无参数,就设为nil。
 @param wait 要执行的aSelector方法,是否马上执行。
 如果设置为YES:等待当前线程执行完以后,主线程才会执行aSelector方法;
 设置为NO:不等待当前线程执行完,就在主线程上执行aSelector方法。
 如果,当前线程就是主线程,那么aSelector方法会马上执行。
 
 该方法用途:因为iPhone编程,对UI的修改,只能在主线程上执行。可以用该方法来完成UI的修改。
 */
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait {
       NSLog(@"用的多");
}

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array {

}

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait {
    
}

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array {

}

/**
 在当前线程中执行指定的方法,使用默认模式,并指定延迟。

 @param aSelector 指定的方法。含义同上,不在赘述。
 @param anArgument 同上
 @param delay 指定延迟时间(秒)。
 */
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay {
      NSLog(@"用的多");
}

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes {

}

 

iOS socket网络编程(一)

 

posted on 2020-03-06 14:51  二狗你变了  阅读(608)  评论(0)    收藏  举报

导航