Webcourse/10-Node.js和数据库/WebSocket.md
2020-04-20 10:16:01 +08:00

70 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## WebSocket 的引入
### 背景分析
HTTP协议是无状态的服务器只会响应来自客户端的请求但是它与客户端之间不具备持续连接
当用户在浏览器上进行操作时可以请求服务器上的api但是反过来却不可能服务器端发生了一个事件无法将这个事件的信息**实时主动**地通知客户端只有在客户端查询服务器当前状态时所发生事件的信息才会从服务器传递到客户端
那怎么去实时地知道服务器的状态呢方法有两个
1**轮询**客户端每隔很短的时间都会对服务器发出请求查看是否有新的消息只要轮询速度足够快例如1秒就能给人造成交互是实时进行的印象这种做法是无奈之举实际上对服务器客户端双方都造成了大量的性能浪费
2**长连接**客户端只请求一次但是服务器会将连接保持不会返回结果当服务器有了新数据时实时地发给客户端而一直保持挂起状态这种做法的也造成了大量的性能浪费
### WebSocket 协议
最新的 HTML5协议制定了 WebSocket 协议标准允许客户端和服务器端以**全双工**的方式进行通信
WebSocket 的原理非常简单利用HTTP请求产生握手HTTP头部含有 WebSocket 协议的请求**握手之后二者转用TCP协议进行交流*QQ的协议
WebSocket协议需要浏览器和服务器都支持才可以使用
- 支持WebSocket协议的浏览器有Chrome 4火狐4IE10Safari5
- 支持WebSocket协议的服务器有Node 0Apach7.0.2Nginx1.3
### http 长连接和 websocket 的长连接区别
HTTP1.1通过使用Connection:keep-alive进行长连接HTTP 1.1默认进行持久连接在一次 TCP 连接中可以完成多个 HTTP 请求但是对每个请求仍然要单独发 headerKeep-Alive不会永久保持连接它有一个保持时间可以在不同的服务器软件如Apache中设定这个时间
websocket是一个真正的全双工长连接第一次tcp链路建立之后后续数据可以双方都进行发送**不需要发送请求头**
keep-alive双方并没有建立正真的连接会话服务端可以在任何一次请求完成后关闭WebSocket 它本身就规定了是正真的双工的长连接两边都必须要维持住连接的状态
### Socket.IO 的引入
Node.js上需要写一些程序来处理TCP请求
Node.js从诞生之日起就支持 WebSocket 协议不过从底层一步一步搭建一个Socket服务器很费劲想象一下Node写一个静态文件服务都那么费劲所以有大神帮我们写了一个库 Socket.IO
Socket.IO 是业界良心新手福音它屏蔽了所有底层细节让顶层调用非常简单并且还为不支持 WebSocket 协议的浏览器提供了长轮询的透明模拟机制
Node的单线程非阻塞I/O事件驱动机制使它非常适合Socket服务器
### Socket.IO 的安装
Socket.IO 的官网是<http://socket.io/>
安装方式
```
npm install socket.io
```