iOS使用GCDSocketManager實現(xiàn)長連接代碼部分

.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++;
    
   //在這里進(jìn)行校驗操作,情況分為成功和失敗兩種,成功的操作一般都是拉取數(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"];
    
    //程序在前臺才進(jìn)行重連
    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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 貌似進(jìn)入2016年就沒再更新簡書,把寫作忘了。罪過。 OK,進(jìn)入正題,開始今天的技術(shù)講解。 太概念的知識網(wǎng)上有很多...
    fou7閱讀 22,532評論 29 106
  • ## 可重入函數(shù) ### 可重入性的理解 若一個程序或子程序可以安全的被并行執(zhí)行,則稱其為可重入的;即當(dāng)該子程序正...
    夏至亦韻閱讀 804評論 0 0
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,598評論 9 468
  • 追求道德層次,我不過是為了心理的舒適——因為當(dāng)我自私時,我的整個狀態(tài)是匱乏的,伴隨著的是一種不舒服的感覺。 所以,...
    雨澤兒閱讀 123評論 0 0
  • 《我心深處》出自一位熱誠的電影藝術(shù)家之手,艾倫不單單以一個過來人,旁觀者,引導(dǎo)者的角度詮釋對于自己的作品的看法,...
    語痕閱讀 260評論 0 0

友情鏈接更多精彩內(nèi)容