iOS使用GCDSocketManager实现长连接
来源:互联网 发布:中国古代盔甲知乎 编辑:程序博客网 时间:2024/06/05 17:39
.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
作者:huber
链接:https://www.jianshu.com/p/60fd4ae4cd74
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
阅读全文
0 0
- iOS使用GCDSocketManager实现长连接
- iOS使用GCDSocketManager实现长连接
- iOS使用socketIO实现长连接
- Ios长连接AsyncSocket使用
- iOS之实现后台socket长连接
- iOS长连接Socket使用--AsyncSocket
- iOS中使用GCDAsyncSocket建立长连接
- 使用 .NET 实现 Ajax 长连接
- 使用 .NET 实现 Ajax 长连接
- 使用 .NET 实现 Ajax 长连接
- 使用 .NET 实现 Ajax 长连接
- 使用mina实现Android长连接
- 使用OkHttp之Websocket实现长连接
- iOS 长连接
- IOS webSocket 长连接
- PHP实现长连接
- HTTP实现长连接
- PHP实现长连接
- Oracle视图(View)demo
- 从0开始学习 GitHub 系列之「04.向GitHub 提交代码」
- HTML5 移动页面自适应手机屏幕四类方法
- 第4章 列表
- RecyclerView条目的点击事件,接口回调
- iOS使用GCDSocketManager实现长连接
- 计算机基本组成
- 基于JQuery的图片上传预览插件(图片预览、过滤文件类型、限制图片大小、图片显示后回调)
- 根据 *_train_val.prototxt文件生成 *_deploy.prototxt文件
- numpy线性代数
- mysql数据库设计规范浅谈(一)
- 第5章 字典和结构化数据
- C++ 指针的两种操作,通过指针赋值 & 对指针赋值
- Python的类