使用Swift的iOS中的Websocket

WebSocket允许极其快速的双向网络通信,这使您可以更快,更频繁地发送和接收更新,更不用说安全了。 WebSocket是一种使用套接字的通信协议,可通过单个TCP连接提供双工通信。 它由IETF于2011年标准化,是与HTTP不同的协议。

WebSockets广泛用于聊天应用程序,流实时通知和股票价格中。

Websocket生命周期

与服务器握手

握手应用程序是WebSockets中的Web部件。 这是从HTTP到WebSocket的桥梁。 客户端向服务器发送一个非常标准的HTTP GET请求:

  GET / chat HTTP / 1.1 
主持人:example.com:8000
升级:websocket
连接:升级
Sec-WebSocket-密钥:dGhlIHNhbXBsZSBub25jZQ ==
安全WebSocket版本:1

这里最有趣的是`Sec-WebSocket-Key`,出于安全原因,它是根据WebSocket标准生成的。

服务器验证请求,如果一切正常,则发送回HTTP响应:

  HTTP / 1.1 101交换协议 
升级:websocket
连接:升级
Sec-WebSocket-接受:s3pPLMBiTxaQ9kYGzzhZRbK + xOo =

交流信息

服务器或客户端可以随时发送遵循以下特定格式的数据:

我不会详细介绍每个部分,但是您可以在标准中找到更多信息。

乒乓球

客户端或服务器在任何时候都可以发送ping,而另一方必须发送回pong。

闭幕

任何一方都可以通过发送指定的控制序列来关闭连接。

在iOS中实现WebSockets

在iOS,macOS,tvOS或watchOS中实现WebSocket并非易事。 新的Network.framework可以简化此操作,但是您仍然需要处理基础任务,例如升级连接和设置WebSocket框架。

红蜘蛛

Swift WebSocket客户端库Startscream简化了所有繁重的任务。 安装该库并将其导入任何Swift文件中。

 进口红蜘蛛 

建立连接

之后,创建一个连接并设置委托。

 套接字= WebSocket(URL:URL(字符串:“ ws:echo.websocket.org”)!) 
socket.delegate =自我

设置代表团

然后,我们需要设置委托方法。 Starscream还提供了使用闭包的选项,但在此不做介绍。

  • websocketDidConnect
  • websocketDidDisconnect
  • websocketDidReceiveMessage
  • websocketDidReceiveData
  • websocketDidReceivePong(可选)

一旦完成,就可以开始连接了。 库在后台完成了握手和升级连接。

  socket.connect(); 

传送资料

有几种发送数据的方法:

  • 二元
  • ping
  • ong

最简单的方法是只发送一个字符串:

  socket.write(string:“嗨,服务器!”) 

断开连接

在任何时候,我们都可以检查连接是否仍处于打开状态,如果不再需要它,则可以将其关闭。

 如果socket.isConnected { 
socket.disconnect()
}

TL; DR

WebSocket不是iOS,macOS,tvOS和watchOS中的一等公民。 实施,使用和理解它可能会让人不知所措,但是Swift库Starscream可以帮助您完成所有这些任务。

链接

  • WebSocket协议
  • 编写WebSocket服务器
  • 红蜘蛛Swift WebSocket库
  • Swift中的Websocket Frame实现
  • Web套接字101
  • WebSocket安全

最初发表于 kristaps.me