一、概述
背景:
-
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