iOS使用GCDSocketManager實(shí)現(xiàn)長連接的方法
更新時(shí)間:2017年12月20日 10:00:11 作者:huber
下面想就為大家分享一篇iOS使用GCDSocketManager實(shí)現(xiàn)長連接的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
.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;
//斷開重連定時(shí)器
@property(nonatomic,strong) NSTimer *timer;
//重連次數(shù)
@property(nonatomic,assign) NSInteger reconnectCount;
@end
@implementation GCDSocketManager
//全局訪問點(diǎn)
+ (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 請(qǐng)求連接
//連接
- (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ù)器會(huì)有響應(yīng)
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
[self.socket readDataWithTimeout:-1 tag:200];
//服務(wù)器推送次數(shù)
self.pushCount++;
//在這里進(jìn)行校驗(yà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"];
//程序在前臺(tái)才進(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
以上這篇iOS使用GCDSocketManager實(shí)現(xiàn)長連接的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
iOS 對(duì)NSMutableArray進(jìn)行排序和過濾的實(shí)例
下面小編就為大家分享一篇iOS 對(duì)NSMutableArray進(jìn)行排序和過濾的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
iOS端React Native差異化增量更新的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于iOS端React Native差異化增量更新的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
iOS掃描二維碼實(shí)現(xiàn)手勢(shì)拉近拉遠(yuǎn)鏡頭
這篇文章主要為大家詳細(xì)介紹了iOS掃描二維碼實(shí)現(xiàn)手勢(shì)拉近拉遠(yuǎn)鏡頭,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
iOS 16 CocoaAsyncSocket 崩潰修復(fù)詳解
這篇文章主要為大家介紹了iOS 16 CocoaAsyncSocket 崩潰修復(fù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
iOS10 App適配權(quán)限 Push Notifications 字體Frame 遇到的問題
這篇文章主要介紹了iOS10 App適配權(quán)限 Push Notifications 字體Frame 遇到的問題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09

