.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>//握手次數(shù)@property(nonatomic,assign) NSInteger pushCount;//斷開重連定時器@property(nonatomic,strong) NSTimer *timer;//重連次數(shù)@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 連接成功//連接成功的回調(diào)- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port { DLog(@"socket連接成功"); [self sendDataToServer];}//連接成功后向服務(wù)器發(fā)送數(shù)據(jù)- (void)sendDataToServer { //發(fā)送數(shù)據(jù)代碼省略... //發(fā)送 [self.socket writeData:jsonData withTimeout:-1 tag:1]; //讀取數(shù)據(jù) [self.socket readDataWithTimeout:-1 tag:200];}//連接成功向服務(wù)器發(fā)送數(shù)據(jù)后,服務(wù)器會有響應(yīng)- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { [self.socket readDataWithTimeout:-1 tag:200]; //服務(wù)器推送次數(shù) self.pushCount++; //在這里進行校驗操作,情況分為成功和失敗兩種,成功的操作一般都是拉取數(shù)據(jù)}#pragma mark 連接失敗//連接失敗的回調(diào)- (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"]) { //重連次數(shù) self.reconnectCount++; //如果連接失敗 累加1秒重新連接 減少服務(wù)器壓力 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實現(xiàn)長連接的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。
新聞熱點
疑難解答