Starscream实现Websocket通讯

  • 1.Starscream 简介
  • 2.Starscream 使用
    • 2.1 Starscream基本使用
    • 2.2 Starscream高阶使用
      • 2.2.1 判断是否连接
      • 2.2.2 自定义头文件
      • 2.2.3 自定义HTTP方法
      • 2.2.4 协议
      • 2.2.5 自签名 SSL
        • 2.2.5.1 SSL引脚
        • 2.2.5.2 SSL密码套件
      • 2.2.6 压缩扩展
      • 2.2.7 自定义队列
      • 2.2.8 高级代理
  • 3.Starscream 使用Demo

1.Starscream 简介

  • Starscream Git 下载地址:点击这里下载Starscream

  • Starscream的特征:

  1. Conforms to all of the base Autobahn test suite.
  2. Nonblocking. Everything happens in the background, thanks to GCD.
  3. TLS/WSS support.
  4. Compression Extensions support (RFC 7692)
  5. Simple concise codebase at just a few hundred LOC.
  • 什么是websocket:

WebSocket protocolHTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。
WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

  1. HTTP 第一次出现是 1991 年,它设计为一种请求/响应式的通讯机制。Web 浏览器用这种机制工作良好,用户请求 web 页,服务器返回内容。但某些时候,需要有新数据时不经过用户请求就通知用户——也就是,服务器推。
  2. HTTP 协议无法很好地解决推模型。在 websocket 出现前,web 服务通过一系列浏览器刷新机制来实现推模型,但效率无法让人满意。
  3. webSocket 实现了服务端推机制。新的 web 浏览器全都支持 WebSocket,这使得它的使用超级简单。通过 WebSocket 能够打开持久连接,大部分网络都能轻松处理 WebSocket 连接。
  4. WebSocket 通常应用在某些数据经常性或频繁改变的场景。例如 Facebook 中的 web 通知、Slack 中的实时聊天、交易系统中的变化的股票价格
  • socket通讯过程:

  • 集成Websocket:

开发中推荐使用Starscream框架。通过pod 方式导入:

 pod 'Starscream'
  • Starscream 使用swift版本为4.2

2.Starscream 使用

2.1 Starscream基本使用

 import UIKitimport Starscream@objc public protocol DSWebSocketDelegate: NSObjectProtocol{/**websocket 连接成功*/optional func websocketDidConnect(sock: DSWebSocket)/**websocket 连接失败*/optional  func websocketDidDisconnect(socket: DSWebSocket, error: NSError?)/**websocket 接受文字信息*/func websocketDidReceiveMessage(socket: DSWebSocket, text: String)/ **websocket 接受二进制信息*/optional  func  websocketDidReceiveData(socket: DSWebSocket, data: NSData)}public class DSWebSocket: NSObject,WebSocketDelegate {var socket:WebSocket!weak var webSocketDelegate: DSWebSocketDelegate?//单例class func sharedInstance() -> DSWebSocket{return manger}static let manger: DSWebSocket = {return DSWebSocket()}()//MARK:- 链接服务器func connectSever(){socket = WebSocket(url: NSURL(string: 你的URL网址如:ws://192.168.3.209:8080/shop))socket.delegate = selfsocket.connect()}//发送文字消息func sendBrandStr(brandID:String){socket.writeString(brandID))}//MARK:- 关闭消息func disconnect(){socket.disconnect()}//MARK: - WebSocketDelegate//客户端连接到服务器时,websocketDidConnect将被调用。public func websocketDidConnect(socket: WebSocket){debugPrint("连接成功了: \(error?.localizedDescription)")webSocketDelegate?.websocketDidConnect!(self)}//客户端与服务器断开连接后,将立即调用 websocketDidDisconnect。public func websocketDidDisconnect(socket: WebSocket, error: NSError?){debugPrint("连接失败了: \(error?.localizedDescription)")webSocketDelegate?.websocketDidDisconnect!(self, error: error)}//当客户端从连接获取一个文本框时,调用 websocketDidReceiveMessage。//注:一般返回的都是字符串public func websocketDidReceiveMessage(socket: WebSocket, text: String){debugPrint("接受到消息了: \(error?.localizedDescription)")webSocketDelegate?.websocketDidReceiveMessage!(self, text: text)}public func websocketDidReceiveData(socket: WebSocket, data: NSData){debugPrint("data数据")webSocketDelegate?.websocketDidReceiveData!(self, data: data)}}
  • 编写一个pong框架
    writePong方法与writePing相同,但发送一个pong控制帧。
socket.write(pong: Data()) //example on how to write a pong control frame over the socket!

Starscream会自动响应传入的ping 控制帧,这样你就不需要手动发送 pong。

但是,如果出于某些原因需要控制这个 prosses,你可以通过禁用 respondToPingWithPong 来关闭自动 ping 响应。

socket.respondToPingWithPong=false//Do not automaticaly respond to incoming pings with pongs.

当客户端从连接获得一个pong响应时,调用 websocketDidReceivePong。 你需要实现WebSocketPongDelegate协议并设置一个额外的委托,例如: socket.pongDelegate = self

funcwebsocketDidReceivePong(socket: WebSocketClient, data: Data?) {print("Got pong! Maybe some data: (data?.count)")
}

2.2 Starscream高阶使用

2.2.1 判断是否连接

if socket.isConnected {// do cool stuff.}

2.2.2 自定义头文件

  • 你可以使用自己自定义的web socket标头覆盖默认的web socket标头,如下所示:
var request = URLRequest(url: URL(string: "ws://localhost:8080/")!)
request.timeoutInterval = 5
request.setValue("someother protocols", forHTTPHeaderField: "Sec-WebSocket-Protocol")
request.setValue("14", forHTTPHeaderField: "Sec-WebSocket-Version")
request.setValue("Everything is Awesome!", forHTTPHeaderField: "My-Awesome-Header")
let socket = WebSocket(request: request)

2.2.3 自定义HTTP方法

  • 你的服务器在连接到 web socket时可能会使用不同的HTTP方法:
var request = URLRequest(url: URL(string: "ws://localhost:8080/")!)
request.httpMethod = "POST"
request.timeoutInterval = 5
let socket = WebSocket(request: request)

2.2.4 协议

  • 如果需要指定协议,简单地将它的添加到 init:
//chat and superchat are the example protocols here
socket = WebSocket(url: URL(string: "ws://localhost:8080/")!, protocols: ["chat","superchat"])
socket.delegate = self
socket.connect()

2.2.5 自签名 SSL

socket = WebSocket(url: URL(string: "ws://localhost:8080/")!, protocols: ["chat","superchat"])//set this if you want to ignore SSL cert validation, so a self signed SSL certificate can be used.
socket.disableSSLCertValidation = true

2.2.5.1 SSL引脚

  • Starscream还支持SSL固定。
socket = WebSocket(url: URL(string: "ws://localhost:8080/")!, protocols: ["chat","superchat"])
let data = ... //load your certificate from disk
socket.security = SSLSecurity(certs: [SSLCert(data: data)], usePublicKeys: true)
//socket.security = SSLSecurity() //uses the .cer files in your app's bundle

你可以加载证书的Data 小区,否则你可以使用 SecKeyRef,如果你想要使用 public 键。 usePublicKeys bool是使用证书进行验证还是使用 public 键。 如果选择 usePublicKeys,将自动从证书中提取 public 密钥。

2.2.5.2 SSL密码套件

  • 要使用SSL加密连接,你需要告诉小红你的服务器支持的密码套件。
socket = WebSocket(url: URL(string: "wss://localhost:8080/")!, protocols: ["chat","superchat"])// Set enabled cipher suites to AES 256 and AES 128
socket.enabledSSLCipherSuites = [TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]

如果你不知道服务器支持哪些密码套件可以查看:SSL Labs

2.2.6 压缩扩展

  • Starscream支持压缩扩展( RFC 7692 )。 默认情况下,压缩是启用的,但是只有当服务器支持压缩时才会使用压缩。 你可以通过 .enableCompression 属性启用或者禁用压缩:
socket = WebSocket(url: URL(string: "ws://localhost:8080/")!)
socket.enableCompression = false
  • 如果应用程序正在传输已经压缩。随机或者其他uncompressable数据,则应禁用压缩。

2.2.7 自定义队列

  • 调用委托方法时可以指定自定义队列。 默认使用 DispatchQueue.main,因此使所有委托方法调用都在主线程上运行。 重要的是要注意,所有 web socket处理都是在后台线程上完成的,只有修改队列时才更改委托方法。 实际的处理总是在后台线程上,不会暂停你的应用程序。
socket = WebSocket(url: URL(string: "ws://localhost:8080/")!, protocols: ["chat","superchat"])
//create a custom queue
socket.callbackQueue = DispatchQueue(label: "com.vluxe.starscream.myapp")

2.2.8 高级代理

socket.advancedDelegate = self
  • websocketDidReceiveMessage
func websocketDidReceiveMessage(socket: WebSocketClient, text: String, response: WebSocket.WSResponse) {print("got some text: \(text)")print("First frame for this message arrived on \(response.firstFrame)")
}
  • websocketDidReceiveData
func websocketDidReceiveData(socket: WebSocketClient, data: Date, response: WebSocket.WSResponse) {print("got some data it long: \(data.count)")print("A total of \(response.frameCount) frames were used to send this data")
}
  • websocketHttpUpgrade

当发送HTTP升级请求后,会返回下面回调

func  websocketHttpUpgrade(socket: WebSocketClient, request: CFHTTPMessage) {print("the http request was sent we can check the raw http if we need to")
}func  websocketHttpUpgrade(socket: WebSocketClient, response: CFHTTPMessage) {print("the http response has returned.")
}

3.Starscream 使用Demo

IOS Websocket (一) Starscream实现Websocket通讯相关推荐

  1. 基于 websocket 实现的 im 实时通讯案例

    分享利用 redis 订阅与发布特性,巧妙的现实高性能im系统.为表诚意,先贴源码地址:https://github.com/2881099/im 下载源码后的运行方法: 运行环境:.NETCore ...

  2. 使用 Django WebSocket Redis 搭建在线即时通讯工具

    话不多说先上效果图演示 项目:http://112.74.164.107:9990/ 1.安装组建 redis: yum install redis/apt install redis 2.创建虚拟化 ...

  3. 基于WebSocket的网页端即时通讯

    基于WebSocket的网页端即时通讯 最近项目中需要用到一些即时通讯的相关技术,查阅了一些资料后发现有些示例不是让人很满意,所以博主写了一个demo,就怕以后会忘掉,也方便博友查看. 由于博主用的是 ...

  4. WebSocket WebSocket的简单用法 WebSocket的使用

    WebSocket的使用 WebSocket一般用于局域网络的通讯使用,他比socket好用,原理也就是socket的封装,对使用者来说,比用socket更方便,快捷. 1 自定义自己的WebSock ...

  5. 认识HTML5的WebSocket 认识HTML5的WebSocket

    2019独角兽企业重金招聘Python工程师标准>>> 在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技 ...

  6. 【Android WebSocket】Android 端 WebSocket 基本用法 ( 下载 Java-WebSocket源码 | 导入 Java-WebSocket-1.5.2 工程作为依赖 )

    文章目录 一.下载 Java-WebSocket 源码 二.Android Studio 工程导入 Java-WebSocket 源码 使用 https://github.com/TooTallNat ...

  7. websocket之二:WebSocket编程入门

    一.WebSocket客户端 websocket允许通过JavaScript建立与远程服务器的连接,从而实现客户端与服务器间双向的通信.在websocket中有两个方法: 1.send() 向远程服务 ...

  8. python websocket库 安装_Python WebSocket

    安装 pip install websocket-client 先来看一下,长连接调用方式: ws = websocket.WebSocketApp("ws://echo.websocket ...

  9. websocket python unity_Unity中Websocket的简单使用

    首先我们需要一个websocket服务器,之前的博文中有做 Tomcat架设简单Websocket服务器 用的时候打开就行了,先不管它 Unity中新建场景 建UI(UGUI) 有一个连接按钮Butt ...

  10. JSON.stringify( new WebSocket(ws://localhost:8080/websocket.do))

    //存在session//先是 test 后是 wsvar test = {test: '', test1: 1,fun:function () {console.info("函数可以吗&q ...

最新文章

  1. python中的装饰器有哪些-python中的装饰器
  2. 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...
  3. centos6 lnmp安装mysql_centos6.5安装lnmp环境
  4. docker nacos mysql nginx 集群一台
  5. TypeError: ufunc ‘multiply‘ did not contain a loop with signature matching types dtype(‘S32‘) dtype(
  6. python核心编程怎么做_Python核心编程:8个实践性建议
  7. 心酸!苹果自研5G芯片最快2022年推出 首款5G iPhone还得靠高通
  8. Python基础 - MySQLdb模块
  9. ReactiveSwift源码解析(三) Signal代码的基本实现
  10. 解决eclipse maven工程中src/main/resources目录下创建的文件夹所显示样式不是文件夹,而是“包“图标样式的问题
  11. SQL查询语句中的 limit offset(转 )
  12. Spring中使用 InitializingBean
  13. java 25 - 2 网络编程之 网络通信三要素
  14. 某厂AD 2008R2/Exchange2010升级迁移项目实施方案
  15. 我是如何获得微信内置表情的
  16. 中国IP对讲产品市场深度研究分析报告
  17. 推荐一款手机、电脑必备的效率工具,功能强大,支持所有平台
  18. 【随机过程】马尔可夫链(1)
  19. 《桃花源记》古文鉴赏
  20. 游客屈指可数的人间天堂――四千美岛

热门文章

  1. 对于公司的管理者,如何解决Facebook操作者离职的问题,facebook能公司统一管理吗?会不会和Facebook真实身份注册有冲突,
  2. C语言编程 犯二的程度,犯二的程度 - osc_jhl7rojx的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 计算机局域网访问受限制,电脑本地连接受限制的处理方法
  4. Leetcode刷题 2021.02.15
  5. (C语言)2048游戏实现
  6. 网站点击流数据分析项目
  7. 诡异事件之--数据库存3.12E8 但是自动变成了31.00
  8. 电脑键盘上各个键的作用
  9. 乐山市计算机学校灵异事件,真人真事:我们学校那些灵异的事情(西南交通大学灵异事件)...
  10. spire.office for.net 的Crack