首页
您所在的位置:首页 > 句子 > 正文

IOS之WebSocket框架Starscream案例详解

作者:句子 来源:http://www.baidu.com/ 日期:2021/10/27 21:20:41 人气:41 加入收藏 标签:We 服务 使用 连接

传统的网络技术(即Berkeley套接字)被认为是可靠和稳定的。但是Berkeley套接字在某些Web技术下不能很好地工作,例如代理和防火墙。WebSocket出现于2011年,是一种在客户端和服务器之间建立双向通信的新技术。WebSocket比多个HTTP请求更高效,并且允许长连接。

在iOS上使用WebSocket并不是那么容易。iOS和Mac库Starscream的出现极大地简化了WebSocket的创建和使用。

注意:本文假设您熟悉CocoaPods。如果您不熟悉,请参阅我们的CocoaPods教程。

在本文中,您将在名为EmojiCommunicator的App中完成网络编程部分。EmojiCommunicator允许您使用表情符号向所有连接到该服务的人发布您当前的心情。

EmojiCommunicator的原始开发者原本打算使用HTTP请求来获取新消息,但这个特性显然更适合使用WebSocket。您将使用Starscream连接到后端Web服务器。

首先你需要一个网络服务器。在本文中,您将在本地计算机上启动Web服务器。本示例的Web服务器在Node.js下运行,并使用一个小的Javascript文件来支持它。

当然,需要先安装Node.js。如果不确定是否已经安装,可以在终端窗口输入命令:

如果报错,请按照以下步骤下载安装Node.js。否则,您将看到Node.js的版本号,您可以跳过下一节Node.js下载。

下载Node.js最新安装包(目前最新版本为2016.9.22)。下载安装包后(如点头e-v6.6.0.pkg),双击安装。请参阅提示并选择默认选项。

安装完成后,在终端中检查Node.js是否正常工作:

如果没有看到6.6.0(或者你安装的版本),或者报错,再次检查安装是否正确。

您将使用聊天服务器。从此处下载示例iOS应用程序和Web服务器代码。将zip包解压到桌面或文件夹中。在终端中,切换到该目录,进入nodeapp子目录。

这个程序需要一个第三方模块,需要和Node.js包管理器npm一起安装。在这个目录下,执行:

键入以下命令以启动聊天服务器:

您将看到类似于以下内容的输出:

2016年9月13日星期二18:54:44GMT-0500(CDT)服务器正在侦听端口1337

然后在浏览器Safari或Chrome中打开frontend.html。?

输入昵称并发送测试消息。如果要在第二个客户端上进行测试,请重新打开浏览器或选项卡并使用相同的Url。使用另一个昵称登录并发送消息;您会立即看到该消息出现在另一个浏览器中。

这充分说明了WebSocket的强大。每个浏览器都与Web服务器有单独的长连接——无需刷新。当消息到达时,服务器会自动向所有连接的客户端广播。回到终端,可以看到所有聊天活动:

$nodechat-server.jsTueSep13201618:54:44GMT-0500(CDT)服务器正在侦听端口1337TueSep13201618:55:19GMT-0500(CDT)来自原点的连接null.TueSep13201618:55:19GMT-0500(CDT)已接受连接。2016年9月13日星期二18:55:34GMT-0500(CDT)用户被称为:Aaron绿色。2016年9月13日星期二18:55:37GMT-0500(CDT)收到来自Aaron的消息:HelloTue2016年9月13日18:58:49GMT-0500(CDT)来自原点的连接null.TueSep13201618:58:49GMT-0500(CDT)连接已接受.TueSep13201618:58:51GMT-0500(CDT)用户被称为:James红色。TueSep13201618:58:55GMT-0500(CDT)收到来自James的消息:这很漂亮!TueSep13201618:59:03GMT-0500(CDT)从James收到消息::)TueSep13201618:59:27GMT-0500(CDT)Peerundefined断开连接。

HTTP第一次出现于1991年,它被设计为一种请求/响应通信机制。Web浏览器可以很好地使用这种机制。用户请求一个网页,服务器返回内容。但有时,当需要新数据时,会在没有用户请求的情况下通知用户——即服务器推送。

HTTP协议不能很好地解决推送模型。在网络套接字中在出现之前,Web服务通过一系列浏览器刷新机制实现了推送模型,但效率并不理想。

webSocket实现了服务器推送机制。新的浏览器都支持WebSocket,使用起来超级方便。持久连接可以通过WebSocket打开,大多数网络都可以轻松处理WebSocket连接。

WebSocket通常用于某些数据频繁或频繁更改的场景。示例包括Facebook中的网络通知、Slack中的实时聊天以及交易系统中的股票价格变化。

在iOS中使用WebSocket比较麻烦,需要做很多设置,内置的API根本帮不上忙。这时候红蜘蛛出现了——这个小巧易用的图书馆,让你的所有烦恼一扫而光。

打开EmojiTransmitter.xcodeproj。在模拟器中运行该程序,该程序非常简单,它需要用户输入昵称,然后显示一个界面,让用户选择要发送的表情符号,并显示任何收到的表情符号。

此App尚未完成网络部分。您将使用Starscream执行所有WebSocket网络请求。

有很多方法可以将Starscream集成到您的项目中。CocoaPods和Carthage是两种最常见的包管理器。您可以同时使用两者,但本文将使用CocoaPods。

首先,关闭打开的项目。打开终端窗口并将目录更改为项目文件夹。这个项目中已经有一个Podfile配置了Starscreampod。可以直接安装pod:

CocoaPods安装完成后,在Xcode8中打开EmojiTransmitter.xcworkspace文件,运行程序查看App是否可以运行。

打开视图控制器。Swift,在导入UIKit之后,添加:

然后,在ViewController类的username属性后面添加一个属性:

这是创建WebSocket连接的核心。注意URL的歌声,协议是ws而不是Http/https。协议参数指定为chat,这取决于服务器的实现。可以使用或忽略此协议。在这个演示中,只需忽略它。

然后在viewDidLoad方法之后添加:

当ViewController被销毁时,WebSocket连接被强制关闭。

Starscream中的所有工作都在委托中完成。如果您不想使用委托,红蜘蛛还支持闭包。

在ViewController.swift中,在fileprivate扩展后添加一个扩展:

这4个委托方法必须实现,否则代码无法编译。

然后,在viewDidLoad方法的super.viewDidLoad()之后添加:

运行程序,输入昵称,然后单击下一步。返回Node.js控制台,您将看到连接通知。

现在您可以连接到Node.js应用程序,下一步是向服务器发送消息。

首先,将sendMessage(_:)方法修改为:

这将向Node.js服务器发送一条消息(在本例中为表情符号)。

然后,添加websocketDidConnect(_:)方法:

这将发送您在建立连接后在第一个界面中输入的昵称。该服务器将使用收到的第一条消息作为用户名。

添加websocketDidDisconnect(_:error:):

无论出于何种原因,只要socket断开,就会返回用户输入昵称的界面。如果您在自己的App中,则应在此处执行更强大的错误处理。

然后,在websocketDidReceiveMessage(_:text:)方法中:

接收到的短信是一个可读的字符串——如果是JSON,尝试将其转换为集合对象。代码解释如下:

首先将字符串转换为NSData,然后将NSData传递给JSONSerialization对象,将其转换为载体并返回有效对象。最后,检查了几个重要的键并设置了相应的值。如果对象无效,直接通过guard语句退出。

过滤消息的messageType,然后将数据传递给messageReceived(messageText:,senderName:)方法。

以下是从Node.js收到的JSON格式消息示例:

运行应用程序,每当您发送消息时,表情符号都会刷新为您选择的表情符号和昵称。返回Web控制台,您的表情符号消息也会显示出来。

这就是红蜘蛛的用法!

在这里下载完成的项目。

EmojiCommunicator是使用WebSocket的最简单示例。如果您想在现有服务中使用红蜘蛛,可以参考更多信息:

请参阅GitHub上的Starscream项目主页。

参考MozillaDeveloperNetwork的WebSocket介绍以及如何实现WebSocket。

如果您需要一些昏昏欲睡的东西,请阅读有关WebSocket协议规范的RFC6455。

如果您有任何问题或建议,请在下方留言。

本文网址:http://yancijuji.com/juzi/5366.html
读完这篇文章后,您心情如何?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0