## webSocket初探
## 目录
- 为什么WebSocket
- 什么是WebSocket
- WebSocket JS Client
- WebSocket Node Server
## 一、为什么WebSocket
1、在WebSocket之前我们如何解决服务端向浏览器推送消息的需求?

2、http协议的弊端,和浏览器的限制;
http协议 服务端只能够做到被动的等待客户端的请求,然后做返回;
前端页面收到浏览器的限制并不能够直接在browser和server之间通过tcp的形式建立全双工的连接。
因为要想实现,服务端推送数据,只能够近似的使用browser高频率请求server,来完成近似的推送;
3、Websocket应运而生
那在browser和server之间能不能有一条一次连接,多次使用的全双工通道,便于browser和server之间的数据交换呢?
## 二、什么是WebSocket
### 全双工通信

1、半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。
2、全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信,举例:电话通信。
### 关于http通信模式的解释

### 和HTTP的关系

websocket和Http协议是相互独立的、都是在 TCP 上的应用层协议。 但是借用了Http 1.1 协议的101状态码进行握手。
### 通信过程

1、
HTTP通信流程
TCP三次握手
传送HTTP请求头
传送HTTP请求体
服务器处理后响应头
服务器处理后响应体
断开TCP连接
2、WebSocket通信流程
TCP三次握手
WebSocket握手
浏览器发送请求
服务器发送响应
断开TCP连接
总结:其实可以看得出,WebSocket比HTTP还要多一次握手,但是在频繁交互过程中,WebSocket的优势就表现出来了。
例如,当有10次数据交互时,前者要建立10个TCP连接(HTTP 1.0需要建立10次,HTTP 1.1可以通过长连接keep-alive复用TCP连接),然后要发送10次请求头(包含Cookie等信息,可能会达到K级别),接收的响应信息可能才几个字节(如某些心跳包),这样会极大的浪费带宽等资源。
### 协议头的详解
- Connection: Upgrade, Upgrade:websocket
明确发起的类型是webSocket协议
- Sec-WebSocket-Version:告诉服务器所使用的 Websocket Draft
- Sec-WebSocket-Key: 32pdAhmqFrFZik/MP7fU8A==
握手的认证串,服务端需要将此key进行一定处理后返回,再由浏览器验证有效性,必须符合算法结果才可正常建立连接
## 三、WebSocket JS Client
1、创建WebSocket实例
new WebSocket('ws://127.0.0.1:3000')

readyState值如下:
- 正在建立连接, WebSocket.OPENING
- 已经建立连接, WebSocket.OPEN
- 正在关闭连接, WebSocket.CLOSING
- 已经关闭连接, WebSocket.CLOSE
握手协议成功以后,readyState就从0变为1,并触发open事件,这时就可以向服务器发送信息了
2、收发数据
- 发送数据
connection.send("hello, wolrd")

- 接受数据
通过onmessage函数进行回调

3、错误处理
通过onerror函数进行回调
4、关闭事件
通过onclose函数进行回调
## 四、WebSocket Node Server
1、创建WebSocket Server

2、收发数据

网友评论