IOS中Starscream的使用

一、概述

背景:

  • HTTP 协议无法实现服务器主动向用户端发起消息。服务器有连续的状态变化,用户端要获知就非常麻烦。大多数 Web 应使用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常白费资源(由于必需不停连接,或者者 HTTP 连接始终打开)。

概念:

  • WebSocket是基于http,在TCP协议连接之上的协议,属于应用层协议。只需要TCP建立一次连接,并且能实现服务器和客户端全双工通信。

WebSocket和Socket的区别:

  • WebSocket是应用层协议,而socket并不是协议并且作用于传输层。socket是由ip地址和端口号组成的接口

二、Starscream的使用

准备工作

  • 在podfiles文件中加入

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '12.0' 
use_frameworks! 
pod 'Starscream', '~> 4.0.6'
  • 然后运行

pod install

连接

private var websocket: WebSocket
...
...
//创建请求
websocket = WebSocket(request: request, certPinner: QTFoundationSecurity(), compressionHandler: WSCompression())
//设置代理
websocket.delegate = self
...
...
func connect() {
    workQueue.async { [weak self] in
        guard let self else { return }
        guard NetworkTool.networkStatus != .offline else {
            self.connectorLog("没有网络 \(self.connectionState.description)", level: .info)
            return
        }
        self.connectorLog("首次连接", level: .info)
        self.resetWebSocket()
        self.websocket.connect()//建立连接
        self.connectionState = .connecting
    }
}


处理WebSocket事件

public func didReceive(event: WebSocketEvent, client: WebSocket) {
    dispatchPrecondition(condition: .onQueue(workQueue))
    switch event {
    case .connected:
        connectionState = .connected
        didConnect()
    case .disconnected(let reason, let code):
        didDisconnect()
        reconnect()
        connectorLog("\(connectionState.description) code:\(code) reason:\(reason)", level: .info)
    case .cancelled:
        didDisconnect()
        connectorLog("连接取消 \(connectionState.description)", level: .info)
    case .error(let error):
        didDisconnect()
        handleError(error)
        reconnect()
    case .text(let message):
        handleMessage(message)
    default:
        break
    }
}

发送消息到服务器

func send(_ message: String) {
    workQueue.async { [weak self] in
        guard let self else { return }
        self.websocket.write(string: message, completion: nil)
    }
}

其他发送

//发送二进制文件给服务器
socket.write(data: data) //write some Data over the socket!
//发送字符串给服务器
socket.write(string: "Hi Server!") //example on how to write text over the socket!
//发送ping控制帧
socket.write(ping: Data()) //example on how to write a ping control frame over the socket!
//发送pong控制帧

断开连接

socket.disconnect()

更多

更多操作参考StarScream的github地址:https://github.com/daltoniam/Starscream

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值