WebSocket 是一种通信协议,使用 ws:// (非加密)和 wss:// (加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。

它是一种双工通信,前端可以主动向后台发送信息,后台也可以主动向前端发送信息。而 HTTP 只是一种半双工,后台只能被动响应。

WebSocket 是高级 API,存在不兼容,但是有一个库,socket.io 可以兼容,一般都是用它。

基本用法

前端

创建一个 socket

  1. let socket = new WebSocket('ws://localhost:3000');

发送信息,在通道开启之后,才能发送

  1. socket.onopen = function() {
  2. socket.send('aa');
  3. }

接受信息

  1. socket.onmessage = function (e) {
  2. console.log(e.data);
  3. }

后台

在后台,需要安装 ws 包

  1. npm install ws

开启 ws 服务

  1. let express = require('express');
  2. let WebSocket = require('ws');
  3. let app = express();
  4. let wss = new WebSocket.Server({ port: 3000 });

接受数据,在连接之后,监听 onmessage 来获取数据

  1. wss.on('connection', function (ws) {
  2. ws.on('message', function (data) {
  3. console.log(data);
  4. ws.send('bb');
  5. })
  6. })

注意,后台事件处理程序中没有事件对象,直接能够获取到数据

发送数据,建立连接的回调函数中,传入的是 ws,是 WebSocket 的实例,需要与 wss 服务区分开。

  1. wss.on('connection', function (ws) {
  2. ws.send('bb');
  3. })