基于Facebook开源框架SocketRocket的即时通讯
SocketRocket 介绍:
SocketRock 是 Facebook 开源的框架,基于 WebSocket 客户端类库,适用于 iOS、Mac OS、tv OS。GitHub 传送门:https://github.com/facebook/SocketRocket
安装:pod 'SocketRocket'
也可以拖入文件 SocketRocket:
  
引入框架:
- libicucore.dylib
 - CFNetwork.framework
 - Security.framework
 - Foundation.framework
 
SocketRocket 初始化:
- (void)initSocket
{
if (webSocket) {
return;
}
webSocket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:ServerURL]];
webSocket.delegate = self; // 设置代理线程queue
NSOperationQueue * queue=[[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount=;
[webSocket setDelegateOperationQueue:queue]; // 连接
[webSocket open]; }
// 初始化心跳
- (void)initHeartBeat
{
dispatch_main_async_safe(^{
[self destroyHeartBeat]; __weak typeof (self) weakSelf = self;
//心跳设置为3分钟,NAT超时一般为5分钟
heartBeat = [NSTimer scheduledTimerWithTimeInterval:* repeats:YES block:^(NSTimer * _Nonnull timer) {
NSLog(@"heart");
//和服务端约定好发送什么作为心跳标识,尽可能的减小心跳包大小
[weakSelf sendMsg:@"heart"];
}];
[[NSRunLoop currentRunLoop] addTimer:heartBeat forMode:NSRunLoopCommonModes];
})
} // 取消心跳
- (void)destroyHeartBeat
{
dispatch_main_async_safe(^{
if (heartBeat) {
[heartBeat invalidate];
heartBeat=nil;
}
})
} // 重连机制
- (void)reConnect
{
[self disConnect]; // 超过一分钟就不再重连 之后重连5次 2^5=64
if (reConnectTime>) {
return;
} dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(reConnectTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
webSocket=nil;
[self initSocket];
}); // 重连时间2的指数级增长
if (reConnectTime == ) {
reConnectTime =;
} else {
reConnectTime *=;
}
}
代理方法:
#pragma mark - SRWebScokerDelegate
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
{
NSLog(@"服务器返回的信息:%@",message);
} - (void)webSocketDidOpen:(SRWebSocket *)webSocket
{
NSLog(@"连接成功");
// 连接成功 开始发送心跳
[self initHeartBeat];
} // open失败时调用
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
{
NSLog(@"连接失败。。。。。%@",error);
// 失败了去重连
[self reConnect];
} // 网络连接中断被调用
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
{ NSLog(@"被关闭连接,code:%ld,reason:%@,wasClean:%d",code,reason,wasClean); //如果是被用户自己中断的那么直接断开连接,否则开始重连
if (code == DisConnectTypeByUser) {
[self disConnect];
} else { [self reConnect];
}
//断开连接时销毁心跳
[self destroyHeartBeat];
} //sendPing的时候,如果网络通的话,则会收到回调,但是必须保证ScoketOpen,否则会crash
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload
{
NSLog(@"收到pong回调"); }
基于Facebook开源框架SocketRocket的即时通讯的更多相关文章
- 提高mysql memory(heap) engine内存性能的开源补丁_XMPP Jabber即时通讯开发实践_百度空间
		
提高mysql memory(heap) engine内存性能的开源补丁_XMPP Jabber即时通讯开发实践_百度空间 提高mysql memory(heap) engine内存性能的开源补丁
 - 基于环信的仿QQ即时通讯的简单实现
		
代码地址如下:http://www.demodashi.com/demo/11645.html 我的博客地址 之前一直想实现聊天的功能,但是感觉有点困难,今天看了环信的API,就利用下午的时间动手试了 ...
 - java SSM 框架  代码生成器 websocket即时通讯 shiro redis
		
1. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限. 按钮权限: 给角色分配按钮权限. ...
 - webSocket开源框架:SocketRocket 简单的使用
		
需要用到webSocket,所以搜集了一下使用方法, git下载地址:square/SocketRocket gitHUB 上没有看懂,就要 cocoaPod 导入了 socketRocket 导入这 ...
 - 基于 libevent 开源框架实现的 web 服务器
		
/* 原创文章 转载请附上原链接: https://www.cnblogs.com/jiujue/p/10707153.html */ 自己实现的如有缺漏欢迎提出 直接代码 一切皆在代码中 首先是 ...
 - 基于NPOI开源框架写的ExcelHelper【转载】
		
namespace ExcelTest { using System; using System.Collections.Generic; using System.Data; using Syste ...
 - 基于XMPP利用openfire简单的即时通讯
		
功能的实现结果:能够使自己编写客户端与spark客户端信息通讯,将接受到的信息更新到textview上. 1.下载openfire并安装.设置域名,添加用户 2.下载安装spark客户端 3.jar包 ...
 - 基于环信SDK的IM即时通讯填坑之路(vue)
		
公司最近使用第三方环信SDK的进行通信聊天,基本已完成.记录下填坑之路 1.可以通过以下方式引用 WebSDK 1.安装 npm install easemob-websdk --save 2. 先 ...
 - springboot完整项目,基于人人开源框架
		
这是前端和数据库 下载链接只有31天有效,需要的,请联系QQ2319899766 下载链接密码: 9ksz 这个是后端代码 链接只有31天有效时间,链接失效请联系QQ2319899766提供下载链接 ...
 
随机推荐
- Linux服务器时间设置及同步
			
闲余:夏日将到,园区计划五一期间进行大面积的电网停电检修,运维同学因此将公司测试服务器提前关闭了.收假后,测试告诉我,他发现一个bug--一段定时任务程序未执行,我的第一反应就是--会不会是假期测试服 ...
 - 题解 SP5271 XOINC - A Coin Game
			
SP5271 XOINC - A Coin Game 双倍经验:P2964 [USACO09NOV]硬币的游戏A Coin Game O3做法(TLE):枚举i,j,k,即剩下i枚金币,上一轮选了j枚 ...
 - Java:不得不知的Object类
			
目录 一.equals 1.equals与==有啥区别? 2.equals方法的规范 3.instanceof 和getClass() 4.其他总结 二.hashCode 1.hashCode的规范 ...
 - docker容器 - 导入容器、导出容器、查看容器
			
实验环境 CentOS 7.5 容器 容器是镜像的运行实例.不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层:同时,容器中的应用进程处于运行状态. 导入和导出容器 实现容器的迁移. 导 ...
 - 用Emmet写前端代码
			
Emmet插件:可以用 emmet代码+Tap 写出更多并快捷的html代码,主流编辑器均可安装,安装方法也均不相同! <!-- html:5或者!可以生成html5文档 --> < ...
 - 什么是JWT令牌认证?
			
当下,JWT(JSON Web Token)令牌认证已经变得越来越流行.本文主要介绍JWT令牌认证与传统的Session会话认证机制的区别. 为什么需要认证? HTTP是一种无状态协议,那就意味着当前 ...
 - splay2(区间修改+内存回收)
			
poj3580 要求写一种数据结构: 对一个序列进行 区间增减(add): 区间翻转(reverse): 区间移动(revolve): 插入(insert): 删除(delete): ...
 - Bugku-CTF之多次
			
Day33 多次 http://123.206.87.240:9004 本题有2个flag flag均为小写 flag格式 flag{}
 - java基础(温故而知新)
			
一 数据类型 1.1 8种基本数据类型 1.2 引用数据类型 1.3 java内存机制 1.3.1 寄存器 1.3.2 栈 1.3.3 堆 1.3.4. 静态区/方法区 1.3.5. 运行时常量池(R ...
 - Jmeter 断言使用
			
先说一下使用断言的目的:在request的返回层面增加一层判断机制.因为request成功了,并不代表结果一定正确.类似于QTP中的检查点检查点.断言的使用方法: step_1:在你选择的Sample ...