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 { }
浙公网安备 33010602011771号