第四节 Websocket和SSE的前端代码实现

亮子 | 2026-03-27 09:21:37 | 42 | 0 | 0 | 0

没问题!我直接给你**可直接复制运行、最精简、能跑通**的两套完整代码:
SSE + WebSocket 全套前后端示例(前端原生JS + 后端Node.js最简版)。

你复制下来就能本地运行,直接对比两者的区别。


一、SSE 完整可运行代码(单向推送)

前端代码(index.html)

<!DOCTYPE html>
<html>
<body>
  <h1>SSE 实时消息</h1>
  <div id="msg"></div>

  <script>
    // 1. 连接 SSE
    const sse = new EventSource('/sse');
    const msgBox = document.getElementById('msg');

    // 2. 接收服务端消息
    sse.onmessage = (e) => {
      msgBox.innerHTML += `<p>${e.data}</p>`;
    };

    // 3. 错误(会自动重连)
    sse.onerror = (err) => {
      console.log('SSE 断开,正在自动重连...');
    };
  </script>
</body>
</html>

后端代码(server.js,Node.js)

const express = require('express');
const app = express();

// 托管前端页面
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

// SSE 接口
app.get('/sse', (req, res) => {
  // SSE 响应头
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');
  res.setHeader('Access-Control-Allow-Origin', '*');

  // 每 2 秒推一条消息
  const timer = setInterval(() => {
    const time = new Date().toLocaleTimeString();
    res.write(`data: SSE 推送消息:${time}\n\n`);
  }, 2000);

  // 断开连接清理
  req.on('close', () => {
    clearInterval(timer);
  });
});

app.listen(3000, () => {
  console.log('SSE 服务运行在 http://localhost:3000');
});

运行方法

  1. 新建文件夹,放两个文件
  2. 执行:

    npm init -y
    npm install express
    node server.js
    
  3. 打开浏览器:http://localhost:3000

二、WebSocket 完整可运行代码(双向通信)

前端代码(ws.html)

<!DOCTYPE html>
<html>
<body>
  <h1>WebSocket 双向通信</h1>
  <input id="input" placeholder="输入消息发送给服务端">
  <button onclick="send()">发送</button>
  <div id="msg"></div>

  <script>
    const msgBox = document.getElementById('msg');
    // 1. 连接 WebSocket
    const ws = new WebSocket('ws://localhost:3000');

    // 连接成功
    ws.onopen = () => {
      console.log('WebSocket 连接成功');
    };

    // 接收服务端消息
    ws.onmessage = (e) => {
      msgBox.innerHTML += `<p>服务端:${e.data}</p>`;
    };

    // 发送消息给服务端
    function send() {
      const input = document.getElementById('input');
      const text = input.value;
      ws.send(text);
      msgBox.innerHTML += `<p>我:${text}</p>`;
      input.value = '';
    }

    // 断开(需手动重连)
    ws.onclose = () => {
      console.log('WebSocket 断开,需手动重连');
    };
  </script>
</body>
</html>

后端代码(ws-server.js)

const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const app = express();
const server = http.createServer(app);

// 启动 WebSocket
const wss = new WebSocket.Server({ server });

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/ws.html');
});

// 监听 WebSocket 连接
wss.on('connection', (ws) => {
  console.log('客户端已连接');

  // 接收客户端消息
  ws.on('message', (msg) => {
    console.log('收到客户端:', msg.toString());
    // 服务端回复消息
    ws.send(`服务端已收到:${msg.toString()}`);
  });

  // 每 3 秒主动推送
  const timer = setInterval(() => {
    ws.send(`主动推送:${new Date().toLocaleTimeString()}`);
  }, 3000);

  ws.on('close', () => {
    clearInterval(timer);
    console.log('客户端断开');
  });
});

server.listen(3000, () => {
  console.log('WebSocket 服务运行在 http://localhost:3000');
});

运行方法

npm install ws
node ws-server.js

打开:http://localhost:3000


三、两者运行效果对比

SSE

  • 只能**服务端 → 客户端**
  • 自动重连,不用管
  • 代码极少
  • 适合:通知、日志、行情、状态更新

WebSocket

  • 客户端 ↔ 服务端 双向发消息
  • 可发文件/二进制
  • 断开需要**自己写重连**
  • 适合:聊天、游戏、互动、协作

四、最快选型口诀

  • 只推不收 = SSE
  • 又推又收 = WebSocket

总结

  • 两套代码都**可直接运行**,无坑
  • SSE:基于HTTP、单向、自动重连、超简单
  • WebSocket:独立协议、双向通信、功能更强