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
    评论
Swift 5 使用 WebSocket(一种全双工通信协议)可以让你创建实时、双向的网络连接。WebSocket 提供了一种在客户端和服务器之间持续传输数据的机制,尤其适用于需要实时更新的应用,如聊天应用、游戏或金融交易系统。 以下是使用 Swift 5 实现 WebSocket 通信的基本步骤: 1. **导入所需的库**: 首先,你需要添加 WebSocket 客户端库,例如 `Starscream` 或 `Socket.IO-Client-Swift`。对于 Starscream,添加到你的 `Podfile` : ```swift pod 'Starscream' ``` 然后运行 `pod install` 安装。 2. **设置 WebSocket 服务器地址**: 创建一个 `WebSocketManager` 类,配置服务器 URL: ```swift import Starscream class WebSocketManager { static let shared = WebSocketManager(url: "ws://your-server-url") } class WebSocketManager { private let ws = WebSocket(url: url) init(url: String) { ws.delegate = self ws.connect() } } ``` 3. **实现 WebSocket 的委托方法**: 作为 `WebSocketDelegate`,你需要实现连接、接受、发送和断开连接的方法: ```swift extension WebSocketManager: WebSocketDelegate { func websocket(_ socket: WebSocket, didConnectTo server: Server) { print("Connected to server") // 发送初始化消息 socket.send("Hello, Server!") } func websocket(_ socket: WebSocket, didReceive message: Data) { // 解析接收到的数据 let receivedString = String(data: message, encoding: .utf8)! print("Received: \(receivedString)") } func websocket(_ socket: WebSocket, didFailWithError error: Error) { print("Error: \(error.localizedDescription)") } func websocket(_ socket: WebSocket, didClose with code: CloseCode, reason: String?, wasClean: Bool) { print("Connection closed with code \(code), reason: \(reason)") } } ``` 4. **处理连接状态和错误**: 在适当的地方检查WebSocket的状态,并处理可能出现的错误。 5. **发送和接收数据**: 当需要发送数据时,调用 `send(_:)` 方法,接收数据则在 `didReceive:` 方法处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值