.h文件
#import <Foundation/Foundation.h>#import "GCDAsyncSocket.h"@interface GCDSocketManager : NSObject@property(nonatomic,strong) GCDAsyncSocket *socket;//單例+ (instancetype)sharedSocketManager;//連接- (void)connectToServer;//斷開- (void)cutOffSocket;@end
.m文件
#import "GCDSocketManager.h"#define SocketHost @"地址"#define SocketPort 端口@interface GCDSocketManager()<GCDAsyncSocketDelegate>//握手次數@property(nonatomic,assign) NSInteger pushCount;//斷開重連定時器@property(nonatomic,strong) NSTimer *timer;//重連次數@property(nonatomic,assign) NSInteger reconnectCount;@end@implementation GCDSocketManager//全局訪問點+ (instancetype)sharedSocketManager { static GCDSocketManager *_instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance;}//可以在這里做一些初始化操作- (instancetype)init{ self = [super init]; if (self) { } return self;}#pragma mark 請求連接//連接- (void)connectToServer { self.pushCount = 0; self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; NSError *error = nil; [self.socket connectToHost:SocketHost onPort:SocketPort error:&error]; if (error) { DLog(@"SocketConnectError:%@",error); }}#pragma mark 連接成功//連接成功的回調- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { DLog(@"socket連接成功"); [self sendDataToServer];}//連接成功后向服務器發送數據- (void)sendDataToServer { //發送數據代碼省略... //發送 [self.socket writeData:jsonData withTimeout:-1 tag:1]; //讀取數據 [self.socket readDataWithTimeout:-1 tag:200];}//連接成功向服務器發送數據后,服務器會有響應- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { [self.socket readDataWithTimeout:-1 tag:200]; //服務器推送次數 self.pushCount++; //在這里進行校驗操作,情況分為成功和失敗兩種,成功的操作一般都是拉取數據}#pragma mark 連接失敗//連接失敗的回調- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { DLog(@"Socket連接失敗"); self.pushCount = 0; NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSString *currentStatu = [userDefaults valueForKey:@"Statu"]; //程序在前臺才進行重連 if ([currentStatu isEqualToString:@"foreground"]) { //重連次數 self.reconnectCount++; //如果連接失敗 累加1秒重新連接 減少服務器壓力 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 * self.reconnectCount target:self selector:@selector(reconnectServer) userInfo:nil repeats:NO]; self.timer = timer; }}//如果連接失敗,5秒后重新連接- (void)reconnectServer { self.pushCount = 0; self.reconnectCount = 0; //連接失敗重新連接 NSError *error = nil; [self.socket connectToHost:SocketHost onPort:SocketPort error:&error]; if (error) { DLog(@"SocektConnectError:%@",error); }}#pragma mark 斷開連接//切斷連接- (void)cutOffSocket { DLog(@"socket斷開連接"); self.pushCount = 0; self.reconnectCount = 0; [self.timer invalidate]; self.timer = nil; [self.socket disconnect];}@end
以上這篇iOS使用GCDSocketManager實現長連接的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。
新聞熱點
疑難解答