WebSocket 
websocketd is the WebSocket daemon, It's like CGI, twenty years later, for WebSockets
学习资料
【bilibili】Web前端-3小时教你打造一个聊天室(websocket)
WebSocket 协议
基于TCP的一种新的网络协议,它实现了浏览器与服务器全双工(full-duplex)通信
允许服务器主动发送消息给客户端
文档:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket/WebSocket
创建websocket对象
js
var ws = new WebSocket(url, [protocols]);方法
| 方法 | 说明 | 
|---|---|
| close() | 关闭链接 | 
| send(data) | 发送数据 | 
事件
| 事件名 | 说明 | 
|---|---|
| open | 连接打开 | 
| message | 接收到新消息 | 
| error | 出现错误 | 
| close | 连接关闭 | 
实现技术:
- 客户端:WebSocket
- 服务端:nodejs-websocket / ws
示例 
https://www.bilibili.com/video/BV14K411T7cd?p=8&spm_id_from=pageDriver
客户端代码
html
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible"
          content="IE=edge">
    <meta name="viewport"
          content="width=device-width, initial-scale=1.0">
    <title>WebSocket Demo</title>
</head>
<body>
    <input type="text">
    <button>发送</button>
    <div id="content"></div>
    
    <script src="https://cdn.bootcdn.net/ajax/libs/socket.io/4.4.1/socket.io.min.js"></script>
    <script>
        var socket = io('http://localhost:8080');
        var content = document.getElementById('content');
        var input = document.querySelector('input');
        var button = document.querySelector('button');
        
        // 发送消息
        button.addEventListener('click', function () {
            socket.emit('message', input.value);
        });
        
        // 接收服务器消息
        socket.on('message', function (data) {
            content.innerHTML += data + '<br>';
        });
    </script>
</body>
</html>服务端代码
js
// server.js
const { Server } = require('socket.io');
const { createServer } = require('http');
const httpServer = createServer();
// 处理跨域
const io = new Server(httpServer, {
  cors: {
    origin: '*',
  },
});
io.on('connection', (socket) => {
  // 接收数据
  socket.on('message', (data) => {
    // 发送数据
    socket.emit('message', data);
  });
});
httpServer.listen(8080);