###什么是socket? Socket 其实并不是一个协议。它工作在 OSI 模型会话层(第5层),是为了方便大家直接使用更底层协议(一般是TCP 或 UDP )而存在的一个抽象层。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。

什么是WebSocket?
Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。 Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处: 1 大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。 2 和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。
SocketRocket框架
使用cocoapods导入SocketRocket框架
platform :ios,"7.0"
target "WebScoketTest" do
pod 'SocketRocket'
end
框架并不开源,我们只能看到对外封装的一些方法。 一部分为SRWebSocket的初始化,以及连接,关闭连接,发送消息等方法。另一部分为SRWebSocketDelegate,其中包括一些回调:收到消息的回调,连接失败的回调,关闭连接的回调,收到pong的回调,是否需要把data消息转换成string的代理方法。
使用框架
点击下载例子 其中包括了一个简单的心跳,重连机制和websocket封装好的pingpong机制 部分代码:


(2)什么是pingpong机制?

(3)什么是重连机制?
理论上,我们自己主动去断开的Scoket连接(例如退出账号,APP退出到后台等等),不需要重连。其他的连接断开,我们都需要进行断线重连。 一般解决方案是尝试重连几次,如果仍旧无法重连成功,那么不再进行重连。
webSocket服务端的实现
(1)安装Homebrew
终端运行:
// 链接1
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
(2)成功后,安装node
$ brew install node
(3)安装ws模块
$ npm install ws
此时如果出现错误
npm WARN enoent ENOENT: no such file or directory
可以使用$ npm init -f命令生成一下
(4)cd到下载的js文件路径下
执行$ node 文件名.js
此时运行下载的demo,试试看吧!