您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關iOS如何使用GCDSocketManager實現長連接,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
.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實現長連接”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。