2020-04-03

## webSocket初探

## 目录

- 为什么WebSocket

- 什么是WebSocket

- WebSocket JS Client

- WebSocket Node Server

## 一、为什么WebSocket

1、在WebSocket之前我们如何解决服务端向浏览器推送消息的需求?

![websocket](https://note.youdao.com/yws/api/personal/file/WEBf253aa1afe8b5cf993844253e539e85c?method=download&shareKey=94b0e9cc5afef83c076db6d8c112f5c9)

2、http协议的弊端,和浏览器的限制;

http协议 服务端只能够做到被动的等待客户端的请求,然后做返回;

前端页面收到浏览器的限制并不能够直接在browser和server之间通过tcp的形式建立全双工的连接。

因为要想实现,服务端推送数据,只能够近似的使用browser高频率请求server,来完成近似的推送;

3、Websocket应运而生

那在browser和server之间能不能有一条一次连接,多次使用的全双工通道,便于browser和server之间的数据交换呢?

## 二、什么是WebSocket

###  全双工通信

![websocket](https://note.youdao.com/yws/api/personal/file/WEB6697371b1a585300b3483edef64076c3?method=download&shareKey=4a87cc80d46432369ad617367d29752b)

1、半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;在同一时间只可以有一方接受或发送信息,可以实现双向通信。举例:对讲机。

2、全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发送信息,实现双向通信,举例:电话通信。

### 关于http通信模式的解释

![websocket](https://note.youdao.com/yws/api/personal/file/WEB6e262bc83e846e5b61a10c798fc2782b?method=download&shareKey=69ba32ee50bbeb171d5f6b9f20cafd22)

### 和HTTP的关系

![websocket](https://note.youdao.com/yws/api/personal/file/WEB85b53c72d70a7a08023dd346fe8e83e6?method=download&shareKey=cd6b92fd595089b577d2a061dd9438bf)

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

### 通信过程 

![websocket](https://note.youdao.com/yws/api/personal/file/WEB22e590db4f5467e18f5c5f7f70b43d1b?method=download&shareKey=6effc37612da096ccf5ae9a5772e31cc)

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')

![websocket](https://note.youdao.com/yws/api/personal/file/WEB3a44fa8b620adc9335e268d54a0440a2?method=download&shareKey=98dd70e3126fb7fe9d12417e2435dab2)

readyState值如下:

- 正在建立连接, WebSocket.OPENING

- 已经建立连接, WebSocket.OPEN

- 正在关闭连接, WebSocket.CLOSING

- 已经关闭连接, WebSocket.CLOSE

握手协议成功以后,readyState就从0变为1,并触发open事件,这时就可以向服务器发送信息了

2、收发数据

- 发送数据

connection.send("hello, wolrd")

![websocket](https://note.youdao.com/yws/api/personal/file/WEBb1f92cdf4f8c658274666d49cd8cad5c?method=download&shareKey=2705442abb378b64bb4771ffc34aa1bd)

- 接受数据

通过onmessage函数进行回调

![websocket](https://note.youdao.com/yws/api/personal/file/WEB48cfaa5b0ff6379b2147cf82db6e29ca?method=download&shareKey=e2b3825a805ede9d91af621e0cb5b9cb)

3、错误处理

通过onerror函数进行回调

4、关闭事件

通过onclose函数进行回调

## 四、WebSocket Node Server

1、创建WebSocket Server

![websocket](https://note.youdao.com/yws/api/personal/file/WEBc9aa35e709e05ec82a7e634057e94938?method=download&shareKey=eb47caf92d67c84a02716c5f602ef0cb)

2、收发数据

![websocket](https://note.youdao.com/yws/api/personal/file/WEBf6007d0a92e611e1e5c75cc27658a92a?method=download&shareKey=957c9fa94f0329bd3cce386ce2b741ce)

你可能感兴趣的:(2020-04-03)