WebSocket学习笔记

527 阅读2分钟

一、WebSocket是什么?

WebSocket 是一种网络通信协议,最大的特点是服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

image.png 其他特点:

  • 建立在 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 协议

image.png

  • 响应头如下: image.png

  • 响应行: image.png 此时状态码为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.");
};