iOS使用webSocket的简单实现

iOS 使用websocket搭建本地服务器 1、移动端何时需要搭建本地服务器? 当移动端与web端需要很强很即时的数据交互时,服务端只需要一个结果的时候,在移动端搭建本地服务器,然后让移动端与web端交互,完成一系列动作,把结果告诉服务端,实际应用场景:积分墙。 2、如何在移动端搭建本地服务器? (不知道怎么才能让我自己发布的资源免费) 可以在csdn下载:https://download.youkuaiyun.com/download/u... 阅读详情

最近做K线图相关的东西,需要和服务器进行长连接实时获取数据,因为后台使用webSocket实现的,经过一番波折最终找到了facebook开源的 SocketRocket 框架,他是用oc封装的websocket实现,这篇是在网上找到的使用SocketRocket的例子,感觉写的不错,但是看完也就是个入门,如果要实现自己的长连接,肯定还是需要一番折腾的。
原文链接:http://www.cocoachina.com/ios/20161031/17886.html

一、为什么用 WebSocket
HTTP 通信方式只能由客户端主动拉取,服务器不能主动推给客户端,如果有实时的消息,要立刻通知客户端就麻烦了,要么客户端每隔几秒钟发一次请求,看看有没有新数据,这种方式想想都知道耗流量电量。还一种方式就是走TCP/UDP协议服务器主动推给你,这种方式省流量。还有就是用websocket,websocket是h5里面的东西,h5我不太会,反正它比原生socket用法简单。

二、用法

用 SocketRocket 框架,记住几个代理方法就好了,很简单。

1.创建和设置代理对象

SRWebSocket *socket = [[SRWebSocket alloc] initWithURLRequest:
[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ip地址:端口"]];

socket.delegate = self;    // 实现这个 SRWebSocketDelegate 协议啊

[socket open];    // open 就是直接连接了

2.连接成功会调用这个代理方法

- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
    NSLog(@"连接成功,可以立刻登录你公司后台的服务器了,还有开启心跳");
}

3.连接失败会调用这个方法,看 NSLog 里面的东西

- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error {
    NSLog(@"连接失败,这里可以实现掉线自动重连,要注意以下几点");
    NSLog(@"1.判断当前网络环境,如果断网了就不要连了,等待网络到来,在发起重连");
    NSLog(@"2.判断调用层是否需要连接,例如用户都没在聊天界面,连接上去浪费流量");
    NSLog(@"3.连接次数限制,如果连接失败了,重试10次左右就可以了,不然就死循环了。
    或者每隔1,2,4,8,10,10秒重连...f(x) = f(x-1) * 2, (x=5)");
}

4.连接关闭调用这个方法,注意连接关闭不是连接断开,关闭是 [socket close] 客户端主动关闭,断开可能是断网了,被动断开的。

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean {
    NSLog(@"连接断开,清空socket对象,清空该清空的东西,还有关闭心跳!");
}

5.收到服务器发来的数据会调用这个方法

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message  {
    NSLog(@"收到数据了,注意 message 是 id 类型的,学过C语言的都知道,id 是 (void *)  
        void* 就厉害了,二进制数据都可以指着,不详细解释 void* 了");
    NSLog(@"我这后台约定的 message 是 json 格式数据
        收到数据,就按格式解析吧,然后把数据发给调用层");
}

6.向服务器发送数据

发送的时候可能断网,可能socket还在连接,要判断一些情况,写在下面了

发送逻辑是,我有一个 socketQueue 的串行队列,发送请求会加到这个队列里,然后一个一个发出去,如果掉线了,重连连上后继续发送,对调用层透明,调用层不需要知道网络断开了。

- (void)sendData:(id)data {
    WEAKSELF(ws);
    dispatch_async(self.socketQueue, ^{
        if (ws.socket != nil) {
            // 只有 SR_OPEN 开启状态才能调 send 方法啊,不然要崩
            if (ws.socket.readyState == SR_OPEN) {
                [ws.socket send:data];    // 发送数据

            } else if (ws.socket.readyState == SR_CONNECTING) {
                NSLog(@"正在连接中,重连后其他方法会去自动同步数据");
                // 每隔2秒检测一次 socket.readyState 状态,检测 10 次左右
                // 只要有一次状态是 SR_OPEN 的就调用 [ws.socket send:data] 发送数据
                // 如果 10 次都还是没连上的,那这个发送请求就丢失了,这种情况是服务器的问题了,小概率的
                // 代码有点长,我就写个逻辑在这里好了

            } else if (ws.socket.readyState == SR_CLOSING || ws.socket.readyState == SR_CLOSED) {
                // websocket 断开了,调用 reConnect 方法重连
                [ws reConnect:^{
                    NSLog(@"重连成功,继续发送刚刚的数据");
                    [ws.socket send:data];
                }];
            }
        } else {
            NSLog(@"没网络,发送失败,一旦断网 socket 会被我设置 nil 的");
            NSLog(@"其实最好是发送前判断一下网络状态比较好,我写的有点晦涩,socket==nil来表示断网");
        }
    });
}

7.心跳机制

心跳机制就不难了,开个定时器,问下后台要每隔多少秒发送一次心跳请求就好了。然后注意,断网了或者socket断开的时候把心跳关一下,省资源,不然都断网了,还在循环发心跳,浪费CPU和电量。

iOS webSocket之单利简单实现即时通讯 1.pod 下载RACSRWebSocket 2.添加包 Security.framework Foundation.framework CFNetwork.framework libicucore.A.tbd libicucore.tbd 3.创建单利 导入#import .h中的方法 .m中的 阅读详情

相关推荐

WebSocket 双端实践(iOS/ Golang)

一、使用Starscream(swift)完成客户端长链需求 首先附上Starscream:GitHub地址 第一步:将Starsream导入到项目。 打开Podfile,加上: pod ‘Starscream’, '~> 4.0.0’复制代码 接着pod install。 第二步:实现WebSocket能力。 导入头文件,import Starscream 初始化WebSocket,把一些请求头包装一下(与服务端对好) private func initWebSocket() { // 包装请求头

AAjjx的博客 807

【iOS】—— 实现WebSocket发送消息(SocketRocket第三方库的使用和解析)

偶然之间了解到了利用WebSocket实现后端和前端的相互发送消息,就查了查在iOS里这个东西该怎么写,用舍友写的接口简单实现了两个用户的通信。

m0_62386635的博客 4039

iOS通过SocketRocket实现websocket的即时聊天

最近项目中要做即时通讯功能, 但没打算使用环信,融云等三方平台, 我查了一下资料,ios端实现起来还是比较简单的 ,我也写了一个小demo,和大家分享一下首先到getHub上下载一个 FaceBook的 SocketRocket, 然后倒入工程; 我是直接使用 pod导入SocketRocket首先pod导入SocketRocketplatform :ios, '8.0' pod 'SocketRo

Jesse0308的博客 4700

iOS 集成websocket

1、搜索websocket 的原理 https://www.cnblogs.com/mike123/p/8596550.html 2、找到适合iOS应用的优秀开源库,SocketRocket https://github.com/facebook/SocketRocket#srwebsocket 3、找到该库的使用教程 https://www.jianshu.com/p/cb047e08f2bc ...

m0_37468171的博客 975

iOS端IM开发从入门到填坑

IM开发从入门到填坑Demo IM的实现方式 拿来主义,使用第三方IM服务 IM的第三方服务商国内有很多,底层协议基本上都是基于TCP的,类似有网易云信、环信、融云、极光IM、LeanCloud、云通讯IM(腾讯)、云旺IM(阿里)、容联云、小能、美洽等等,技术也相对比较成熟,提供后台管理和定制化的UI,拿来主义,半小时集成。 缺点也很明显:定制化程度太高,需要二次开发,很多东西我们不可控...

马甲包开发审核交流群:869685378 1378

ios websocket 使用详解

负载数据的长度为扩展数据及应用数据之和,扩展数据的长度可能为0,因而此时负载数据的长度就为应用数据的长度。Extension data: x位,如果客户端与服务端之间没有特殊约定,那么扩展数据的长度始终为0,任何的扩展都必须指定扩展数据的长度,或者长度的计算方式,以及在握手时如何确定正确的握手方式。如果存在扩展数据,则扩展数据就会包括在负载数据的长度之内。即:websocket分为。Application data: y位,任意的应用数据,放在扩展数据之后,应用数据的长度=负载数据的长度-扩展数据的长度。

Rey的技术博客 1765

ios连接java的websocket_Java后端实现websocket与微信小程序端连接简单例子

直接附代码前端代码:String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>My WebSocketWelcomeSend Closevar webso...

weixin_33800919的博客 263

使用Go语言编写移动应用:Android与iOS

1.背景介绍 使用 Go 语言编写移动应用:Android 与 iOS 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 Go 语言的优秀特性

AI天才研究院 1537

IOS WEBSOCKET Objective-C实现

IOS WEBSOCKET Objective-C实现,有服务器部分和客户端部分,实现非常简单,随后我们还会增加C版本的夸端实现代码;

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 225

BLWebSocketsServer:iOS轻量级WebSocket服务器

BLWebSocketsServer:iOS轻量级WebSocket服务器 项目介绍 BLWebSocketsServer 是一个专为 iOS 平台设计的轻量级 WebSocket 服务器,基于 libwebsockets 构建。它不仅支持同步请求,还支持服务器主动推送消息,非常适合需要在 iOS 应用中实现实时通信的开发者。 项目技术分析 核心技术 libwebsockets:BLWebSoc...

gitblog_00196的博客 1253

VMware ESXI 7.0实战:4T硬盘RAID1配置与性能调优全记录

本文详细记录了在VMware ESXI 7.0环境下,为Dell服务器配置两块4T硬盘组建RAID1并进行深度性能调优的全过程。文章重点解析了RAID控制器写入策略(Write-Back with BBU)、读取策略(Read-Ahead)的关键选择,并深入探讨了在ESXI虚拟机层面通过选用PVSCSI控制器、调整虚拟磁盘缓存策略(scsiX:Y.caching)等技巧,以最大化满足数据分析等IO密集型工作负载的需求,最终实现性能的显著提升。

gaochao的博客 259

ios个推透传消息json接收不到_消息通讯——Websocket

说起即时通讯大家应该都听过,像各种聊天软件用到的即时通讯技术是最多的。另外开发过程中实现消息推送最传统的做法就是轮询,即按照特定时间间隔由浏览器对服务器发送请求,以获取最新消息,这种传统模式带来很明显的缺点,即浏览器需要不断的向服务器发送请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样回浪费很多带宽等资源。 这种情况下,HTML...

weixin_34547317的博客 483

400G光模块测试全攻略:从PCS层到CMIS合规的避坑指南

本文为网络设备测试工程师和光通信研发人员提供了一份详尽的400G光模块测试实战指南。文章深入剖析了从PCS层信号完整性、FEC容限到CMIS管理接口合规性测试的全流程,并分享了ANLT协议分析、SerDes眼图调试以及系统级流量压力测试中的核心技巧与常见避坑点,旨在帮助读者构建一套高效、精准的测试体系,确保高速光模块的可靠性与性能。

weixin_29300931的博客 213

LTspice仿真报错Timestep too small?5种实测有效的解决方法(附详细参数配置)

本文针对LTspice仿真中常见的“Timestep too small”报错,提供了5种经过实测有效的解决方案。从理解错误根源入手,详细介绍了调整求解器、仿真参数、优化精度容差、设置初始条件、为理想元件添加寄生参数以及使用高级指令等具体方法,并附有详细的参数配置步骤,帮助工程师快速定位并解决仿真收敛问题,提升电路设计效率。

weixin_29213655的博客 281

网络基础06 HTTP长连接和短连接 + Websocket

HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。 长连接短连接操作过程 短连接的操作步骤是:

多啦的博客 6115

Sparse-ICP—(4) 加权稀疏迭代最近点算法(matlab版)

本文介绍了加权稀疏迭代最近点算法的实现。

点云侠的博客 644

WebRTC 系列(三、点对点通话,H5、Android、iOS)

实现完成后可以感觉到点对点呼叫其实也没有多难,跟本地 Demo 的流程大致一样,只是我们需要将音视频通话的协商信息通过网络传输而已,所以我之前才说,明白 WebRTC 的流程比较重要,信令服务器反而在其次,毕竟真实场景中,信令服务器还会加入很多业务逻辑。下一次我们在信令服务器中加入一些逻辑,来实现多人通话。

禽兽先生不禽兽 2522

一文吃透 SAP HANA SDA:把分散数据当作本地数据来用的那把钥匙

摘要:SAP HANA SDA(Smart Data Access)技术详解:150字精要 SAP HANA SDA是一种数据虚拟化技术,允许在不复制数据的情况下访问远端数据源。核心功能包括: 通过Remote Source定义连接配置 创建Virtual Table作为本地代理 支持谓词下推优化查询性能 与SDI技术协同工作扩展数据集成能力 典型应用场景包括: 跨系统联邦查询 冷热数据分层管理 混合云数据整合 远程表复制(RTR)实现近实时数据同步 实施要点: 需关注适配器能力差异 合理运用查询下推优化

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 325

uniapp - 实现苹果App打包上架App Store应用商店详细教程,详解Hbuilder打包编译ipa发布上传到苹果ios软件商店全流程,提供云打包/离线本地打包ios、申请IOS苹果证书方法

uni-app,苹果ios,苹果app,打包编译,appstore应用商店,ipa发布到软件商店,uniapp的app苹果应用商店上架,上架苹果APPStore,uniApp打包的ipa文件上传到商店,上架苹果商城,审核失败,被拒绝,UniApp打包ipa文件,上架iOSAppStore流程指南,最新详细教程最全,Hbuilder打包发布iosapp,苹果云打包上线全过程,云打包IPA并上传到商店,打包iOSipa文件后怎么发布到应用商店,苹果证书申请教程,ios证书申请,mac电脑,审核很久

🏆 前端领域优质创作者 1万+

论如何在 uni-app 上使用 sockjs 以及 stomp(顺便)

GitHub 项目 本项目可在uni-app 环境上兼容 WebSocket api, 使 sockjs+stomp 可如浏览器环境一般正常运行 该方式原理极其简单, 目前简单测试一切 ok, 关键代码在 js/websocket-uni.js 中, 在其中造一个 WebSocket 对象兼容 uni 的 API 即可 本项目可运行在 IOS APP 上(模拟器亲测) 以及 浏览器上(浏...

这不是博客 5053

PyTorch 面试题及参考答案(精选100道)

模块是 PyTorch 中用于自动求导的核心模块。它为张量上的所有操作提供了自动求导的功能。在深度学习中,反向传播是一种用于计算损失函数相对于模型参数的梯度的算法。通过梯度,我们可以使用优化算法(如随机梯度下降)来更新模型的参数,从而最小化损失函数。模块的主要作用就是自动计算这些梯度。当我们创建一个张量时,如果将其属性设置为True,那么 PyTorch 会跟踪该张量上的所有操作。在完成前向传播计算出损失函数后,调用方法,模块会自动根据链式法则反向传播计算出所有需要求导的张量的梯度。

大模型大数据攻城狮的专栏 1681

通过(Node Js||.Net)基于HTML5的WebSocket实现实时视频文字传输(上)

HTML5 拥有许多引人注目的新特性,如 Canvas、本地存储、多媒体编程接口、WebSocket 等等。虽然现在大家把它捧的很火的样子,但是个人认为它还需要其他平台的支持才能真正的"火起来"。 原来做web通信的时候 基于ajax的“轮询” “长轮询”等其他的方式 网上有很详细的解释 轮询: 这是最早的一种实现实时 Web 应用的方案。客户端以一定的时间间隔向服务端发出请求,以频繁请求的...

weixin_30908103的博客 97

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android版添加phonegap--websocket客户端插件教程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33842304的博客 128

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Multi-Agent Orchestrator 完整实战指南:从第一次跑通到上线的 5 个避坑要点

把多个 AI 智能体接进同一个客服系统,话题一切换上下文就断、请求被分发给答非所问的智能体——这是新手最常踩的坑。Multi-Agent Orchestrator 是一个双语言的多智能体编排框架:分类器把每个请求路由给最合适的 agent,对话历史统一托管。下面这些经验都来自源码和官方示例里真实的坑。 ## 第一次跑通:先认识这条路由流水线 整个系统是一个闭环:用户输入先经分类器,它结合各智能

gitblog_00574的博客 431

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: iOS截屏分享功能实现
下一篇: iOS使用socketIO实现长连接
知更鸟Coollee
博客等级 码龄11年 57粉丝 49原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值