iOS使用GCDSocketManager实现长连接的方法

.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

以上这篇iOS使用GCDSocketManager实现长连接的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • iOS使用GCDSocketManager实现长连接的方法

    .h文件 #import <Foundation/Foundation.h> #import "GCDAsyncSocket.h" @interface GCDSocketManager : NSObject @property(nonatomic,strong) GCDAsyncSocket *socket; //单例 + (instancetype)sharedSocketManager; //连接 - (void)connectToServer; //断开 - (vo

  • Java Web项目中使用Socket通信多线程、长连接的方法

    很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

  • PHP使用Redis长连接的方法详解

    本文实例讲述了PHP使用Redis长连接的方法.分享给大家供大家参考,具体如下: php-redis在github上的项目地址:https://github.com/phpredis/phpredis pconnect函数声明 其中time_out表示客户端闲置多少秒后,就断开连接.函数连接成功返回true,失败返回false: pconnect(host, port, time_out, persistent_id, retry_interval) host: string. can be a

  • django 数据库连接模块解析及简单长连接改造方法

    工作中纯服务端的项目用到了线程池和django的ORM部分.django 的数据库连接在每一个线程中开启一份,并在查询完毕后自动关闭连接. 线程池处理任务时,正常使用的连接中不会被关闭,但由于数据库端有最长连接时间的限制(默认为8小时),在超时后会发生InterfaceError: (0, '')(连接关闭后使用连接/游标)或Error(2006, 'MySQL server has gone away')(mysql 服务器主动关闭连接)这类错误,所以一般会在每个任务线程中调用django.d

  • PHP扩展模块memcached长连接使用方法分析

    网上广泛流传着一篇文章,讲述php的两个扩展模块memcache和memcached的区别,其中特意强调了memcached与memcached一个很大的区别是memcached模块不支持长连接.以至于后来很多年我都认为memcached是不支持长连接的,其实不然,memcached扩展模块从很早的版本开始就已经支持长连接了.从扩展模块的源码注视中我们就能看到: /* {{{ Memcached::__construct([string persistent_id[, callback on_n

  • 基于php实现长连接的方法与注意事项的问题

    php可以通过set_time_limit(0);来取消php脚步超时限制,从而达到长连接的效果. 例子代码如下: 复制代码 代码如下: <?php echo "每隔3秒输出一次<br />"; set_time_limit(0); //保证php程序运行不超时退出 while(1) { echo date("H:i:s")."<br />"; ob_flush(); flush(); //刷新并输出PHP缓冲数据

  • PHP长连接实现与使用方法详解

    本文实例讲述了PHP长连接实现与使用方法.分享给大家供大家参考,具体如下: 长连接技术(Long Polling) 在服务器端hold住一个连接, 不立即返回, 直到有数据才返回, 这就是长连接技术的原理 长连接技术的关键在于hold住一个HTTP请求, 直到有新数据时才响应请求, 然后客户端再次自动发起长连接请求. 那怎么样hold住一个请求呢?服务器端的代码可能看起来像这样的 set_time_limit(0); //这句很重要, 不至于运行超时 while (true) { if (has

  • Python WebSocket长连接心跳与短连接的示例

    安装 pip install websocket-client 先来看一下,长连接调用方式: ws = websocket.WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close) ws.on_open = on_open ws.run_forever()  长连接,参数介绍: (1)url: websocket的地址. (2)h

  • php封装pdo实例以及pdo长连接的优缺点总结

    一.前言 最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了.博主这里选择了封装pdo操作数据库相关. 二.为什么选择pdo 众所周知的,php在早期的时候是带有mysql扩展的,但是后来由于过于古老缺失了mysql的新特性,因此主键没落. 从php5开始,更建议大家使用mysqli扩展,这个是mysql扩展的增强版,是一个面向对象的MySQL接口,更容易使用.缺点是只能操作mysql,不够强大. 还有就是pdo扩展了,这个是最丰富的的一个扩

  • python 将列表中的字符串连接成一个长路径的方法

    今天实习公司分配了一个数据处理的任务.在将列表中的字符串连接成一个长路径时,我遇到了如下问题: import os path_list = ['first_directory', 'second_directory', 'file.txt'] print os.path.join(path_list) 发现 os.path.join 之后,依然是字符串列表.这我就纳闷了: ['first_directory', 'second_directory', 'file.txt'] 细思后想明白了,os

随机推荐