一、WebSocket是什么?
WebSocket 是一种网络通信协议,最大的特点是服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
其他特点:
- 建立在 TCP 协议之上,服务器端的实现比较容易。
- 与HTTP协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用HTTP协议,因此握手时不容易屏蔽,能通过各种HTTP代理服务器
- 数据格式比较轻量,性能开销小,通信高效
- 可以发送文本,也可以发送二进制数据
- 没有同源限制,客户端可以与任意服务器通信
- 协议标识符是ws(如果加密,则为wss),服务器网址就是URL
二、WebSocket应用场景:
- 聊天通信
- 多玩家游戏
- 在线协同编辑
- 股市基金
- 打车程序(实时更新地图位置)
三、通信原理:
- 当客户端要和服务器建立WebSocket连接时,在客户端和服务器的握手过程中,客户端首先会向服务端发送一个HTTP请求,包含一个Upgrade请求头来告知服务端客户端想要建立一个WebSocket连接
- 客户端建立一个WebSocket连接:
const ws = new WebSocket('ws://localhost:9090') //客户端与服务器进行连接
- 此时请求头如下:
Connection: Upgrade // 表示该连接要升级协议
Sec-WebSocket-Key: 3cZwMLrS5tN7deGikvfS5w== // 与响应头 Sec-WebSocket-Accept 相对应
Sec-WebSocket-Version: 13 // 表示 websocket 协议的版本
Upgrade: websocket // 表示要升级到 websocket 协议
-
响应头如下:
-
响应行:
此时状态码为101 Switching Protocols,表示该连接已经从HTTP协议转换为WebSocket通信协议。
四、如何使用?
1.客户端:
var ws = new WebSocket("wss://echo.websocket.org"); //客户端与服务器进行连接
ws.onopen = function(evt) { //成功后的回调函数
console.log("Connection open ...");
ws.send("Hello WebSockets!"); //向服务器发送数据
};
ws.onmessage = function(evt) { //收到服务器数据后的回调函数
console.log( "Received Message: " + evt.data);
ws.close();
};
ws.onclose = function(evt) { //连接关闭后的回调函数
console.log("Connection closed.");
};