国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS使用GCDSocketManager實現(xiàn)長連接的方法

2020-07-26 02:34:42
字體:
供稿:網(wǎng)友

.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)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 蕲春县| 永清县| 乌拉特后旗| 射阳县| 大名县| 九寨沟县| 东乡族自治县| 天柱县| 孟连| 江阴市| 万年县| 洪泽县| 手游| 莫力| 大理市| 电白县| 库车县| 宁夏| 慈利县| 府谷县| 桂阳县| 台南市| 宁都县| 同心县| 安图县| 白玉县| 延边| 隆子县| 定州市| 萝北县| 宣城市| 青岛市| 敖汉旗| 奈曼旗| 贵南县| 凤凰县| 尖扎县| 满洲里市| 时尚| 永州市| 万宁市|