本文主要介绍IOS的WebSocket框架红蜘蛛的详细讲解。本文通过一个简单的案例来说明对这项技术的理解和使用。以下是详细内容,有需要的朋友可以参考一下。
传统的网络技术(即Berkeley sockets)被认为是可靠和稳定的。但是Berkeley socket在某些web技术下并不好用,比如代理和防火墙。WebSocket是2011年出现的一种在客户端和服务器之间建立双向通信的新技术。WebSocket比多个HTTP请求更高效,并且允许长连接。
在iOS上使用WebSocket并不是那么容易。而红蜘蛛,iOS和Mac库,大大简化了WebSocket的创建和使用。
注意:本文假设您熟悉CocoaPods。如果不熟悉,可以参考我们的CocoaPods教程。
在本文中,您将在一个名为Emoji Commuicator的应用程序中完成网络编程部分。Emoji Communicator允许您向所有连接到该服务的人发布带有Emoji字符的当前心情。
Emoji Communicator最初的开发者原本打算使用HTTP请求来获取新消息,但显然使用WebSocket来实现该功能更合适。您将使用红蜘蛛连接到后台Web服务器。
开始
首先,你需要一个网络服务器。在本文中,您将在您的计算机上启动一个web服务器。这个示例的web服务器运行在Node.js下,并使用一个小的Javascript文件来支持它。
当然,你需要先安装Node.js。如果不确定是否已经安装,可以在终端窗口中输入命令:
节点版本
如果报错,请按照以下步骤下载安装Node.js,否则会看到Node.js的版本号,下一节可以跳过Node.js的下载。
安装和下载 Node.js
在https://nodejs.org/下载Node.js的最新安装包(目前最新版本为2016.9.22)。下载安装包(例如node-v6.6.0.pkg)后,双击安装。按照提示,只需选择默认选项。
安装完成后,检查Node.js在终端中是否正常工作:
节点版本
如果您没有看到6.6.0(或您安装的版本),或报告错误,请再次检查安装是否正确。
聊天服务器
您将使用聊天服务器。从这里下载示例iOS应用程序和Web服务器代码。将zip包解压缩到桌面或文件夹中。在终端中,切换到这个目录,进入nodeapp子目录。
这个程序需要一个第三方模块,需要用这个目录下Node.js的包管理器npm安装,执行:
npm安装websocket
输入以下命令启动聊天服务器:
节点chat-server.js
您将看到类似如下的输出:
2016年9月13日星期二18:54:44 GMT-0500 (CDT)服务器正在侦听端口1337
然后在Safari或Chrome中打开frontend.html。
输入昵称并发送测试消息。如果您想在第二个客户端上测试,请重新打开浏览器或选项卡,并使用相同的Url。用另一个昵称登录并发送消息;您将看到该消息立即出现在另一个浏览器中。
这充分说明了WebSocket的强大。每个浏览器都有一个单独的与web服务器的长连接。——不刷新。当消息到达时,服务器会自动将它广播给所有连接的客户端。回到终端,您可以看到所有聊天活动:
$ node chat-Server . jstue 2016年9月13日18时54分44秒GMT-0500 (CDT)服务器正在侦听端口1337 tue 2016年9月13日18时55分19秒GMT-0500 (CDT)连接从原点为空。2016年9月13日星期二18:55:19 GMT-0500 (CDT)连接已接受。2016年9月13日星期二18:55:34 GMT-0500 (CDT)用户被称为:绿色Aaron。2016年9月13日星期二18:55:37 GMT-0500 (CDT)收到来自Aaron的消息:hello tue 2016年9月13日18:58:49 GMT-0500 (CDT)来自原点的连接为空。2016年9月13日星期二18:58:49 GMT-0500 (CDT)连接已接受。2016年9月13日星期二18:58:51 GMT-0500 (CDT)用户被称为:红色詹姆斯。2016年9月13日星期二18:58:55 GMT-0500 (CDT)收到来自詹姆斯的消息:这真是太棒了!2016年9月13日星期二18:59:03 GMT-0500 (CDT)收到来自詹姆斯的消息:]2016年9月13日星期二18:59:27 GMT-0500 (CDT)对等未定义断开连接。
WebSockets
HTTP最早出现于1991年,它被设计为一种请求/响应通信机制。Web浏览器可以很好地使用这种机制。用户请求网页,服务器返回内容。但是有时候需要新数据的时候,不需要用户请求就通知用户——,也就是服务器推送。
HTTP协议不能很好的解决推送模式。在websocket出现之前,web services通过一系列的浏览器刷新机制来推送模型,但是效率并不理想。
WebSocket实现了服务器端的推送机制。所有新的网络浏览器都支持WebSocket,这使得它超级容易使用。WebSocket可以打开持久连接,大部分网络都可以轻松处理WebSocket连接。
WebSocket通常用于一些数据变化频繁或频繁的场景。例如,脸书的web通知、Slack的实时聊天以及交易系统中的股票价格变化。
在iOS中使用WebSocket比较麻烦,要做很多设置,内置API根本帮不上忙。这时候红蜘蛛出现了——,一个小巧易用的库,让你所有的烦恼都烟消云散。
Emoji Communicator
打开EmojiTransmitter.xcodeproj在模拟器中运行程序。程序很简单。它要求用户输入一个昵称,然后显示一个界面,允许用户选择一个表情符号来发送和显示任何收到的表情符号。
这个App还没有完成网络部分。您将使用红蜘蛛执行所有WebSocket网络请求。
有很多方法可以将红蜘蛛整合到你的项目中。CocoaPods和Carthage是两个最常见的包管理器。两者都可以使用,但是本文将使用CocoaPods。
首先,关闭打开的项目。打开终端窗口,将目录切换到项目文件夹。此项目中已经有一个用红蜘蛛pod配置的Podfile文件。您可以直接安装pod:
pod回购更新;pod安装
当CocoaPods安装完成后,在Xcode 8中打开文件EmojiTransmitter.xcworkspace。运行程序,检查应用程序是否可以运行。
打开ViewController.swift并在导入UIKit后添加以下内容:
进口红蜘蛛
然后,在ViewController类的username属性后添加一个属性:
var socket=web socket(URL:URL(string: ws://localhost:1337/)!协议:[聊天])
这是创建WebSocket连接的核心。注意URL的唱法。协议是ws而不是Http/https。协议参数被指定为chat,这取决于服务器的实现。可以使用或忽略该协议。在这个演示中,忽略它。
然后在viewDidLoad方法后添加:
定义{
socket . disconnect(force time out:0)
socket.delegate=空
}
当视图控制器被销毁时,WebSocket连接被强制关闭。
在红蜘蛛,所有的工作都是委托完成的。红蜘蛛也支持闭包,如果你不想使用委托的话。
在ViewController.swift中,在fileprivate扩展名后添加一个扩展名:
//MARK: - WebSocketDelegate
扩展view controller:WebSocketDelegate {
public func websocketDidConnect(_ socket:红蜘蛛。WebSocket) {
}
public func websocketDidDisconnect(_ socket:红蜘蛛。WebSocket,错误:NSError?) {
}
public func websocketDidReceiveMessage(_ socket:红蜘蛛。WebSocket,text: String) {
}
public func websocketDidReceiveData(_ socket:红蜘蛛。WebSocket,data: Data) {
}
}
这四个委托方法必须实现,否则代码无法编译。
然后,在viewDidLoad方法的super.viewDidLoad()之后,添加:
套接字. delegate=self
socket.connect()
运行程序,输入昵称,然后单击下一步。返回Node.js控制台,您将看到一个连接通知。
现在,您已经能够连接Node.js应用程序,下一步是向服务器发送消息。
首先,将sendMessage(_:)方法修改为:
func sendMessage(_ message:String){
socket.write(字符串:消息)
}
这将向Node.js服务器发送一条消息(在本例中是emoji)。
然后,在websocketDidConnect(_:)方法中,添加:
socket.write(字符串:用户名)
这将在连接建立后发送您在第一个界面中输入的昵称。该服务器会将收到的第一封邮件作为用户名。
将以下内容添加到websocketDidDisconnect(_:错误:):
performSegue(带有标识符: websocketDisconnected ,发件人:自己)
不管是什么原因,只要断开套接字,这就会将用户返回到昵称输入界面。如果是在自己的App里,这里要多做一些声音错误处理。
然后,在WebSocketDidReceiveMessage(_:text:)方法中:
//1
guard let data=text.data(使用: utf16),
让jsonData=试试?JSON serialization . JSON object(with:data),
设jsonDict=jsonData为?[字符串:任何],
让messageType=jsonDict[type]为?字符串else {
返回
}
//2
如果messageType==message ,
设messageData=jsonDict[data]为?[字符串:任何],
让message author=message data[ author ]as?字符串,
让message text=message data[ text ]as?字符串{
收到的消息(消息文本,发送者名称:消息作者)
}
接收的文本消息是可读的字符串3354。如果是JSON,尽量把它变成一个集合对象。该代码解释如下:
首先将字符串转换成NSData,然后将NSData传递给JSONSerialization对象,将其转换成一个载体,返回一个有效的对象。最后,检查几个重要的键,并设置相应的值。如果对象无效,直接通过guard语句退出。
筛选消息的messageType,然后将数据传递给messagereceived (messagetext:sendername:)方法。
以下是从Node.js接收的JSON格式的消息示例:
{
类型:消息,
数据:{
时间:1472513071731,
文本“:]”,
作者: iPhone模拟器,
颜色:橙色
}
}
运行该应用程序,每当你发送消息时,表情符号都会用你选择的表情符号和昵称进行刷新。回到网络控制台,你的表情信息也会显示出来。
这就是红蜘蛛的用处!
结束
在这里下载最终完成的项目。
Emoji Communicator是使用WebSocket最简单的例子。如果想在现有服务中使用红蜘蛛,可以参考更多资料:
参考红蜘蛛在GitHub上的项目主页。
参考Mozilla开发者网上关于WebSocket的介绍,以及如何实现WebSocket。
如果你需要一些让你昏昏欲睡的东西,请阅读RFC 6455,关于WebSocket协议规范。
如果你有任何问题或建议,请在下面留下评论。
关于IOS版WebSocket框架红蜘蛛案例的详细讲解,本文到此为止。关于IOS版WebSocket Framework的红蜘蛛的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!