服务器端如何向客户端发送消息?WebSocket实时通信原理

服务器端向客户端发送消息是 Web 开发、即时通讯(IM)、物联网(IoT)等场景中的核心功能,实现方式取决于你的技术栈、实时性要求以及网络环境。

以下是几种主流的实现方案,按实时性从高到低排序:

SpringBoot系列-Websocket 实时聊天
加载中
SpringBoot系列-Websocket 实时聊天

WebSocket(推荐:全双工实时通信)

适用场景:聊天室、游戏、实时股票行情、协同编辑、即时通知。
特点:建立连接后,服务器和客户端可以互相主动发送消息,延迟极低。

后端示例 (Node.js + ws 库)

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
  console.log('客户端已连接');
  // 向特定客户端发送消息
  ws.send(JSON.stringify({ type: 'welcome', message: 'Hello Client!' }));
  // 监听客户端消息
  ws.on('message', (message) => {
    console.log('收到消息:', message);
    // 广播给所有连接者(包括自己)
    wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify({ type: 'broadcast', data: message }));
      }
    });
  });
});

前端示例 (JavaScript)

const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => {
  console.log('连接已建立');
  ws.send(JSON.stringify({ type: 'login', userId: 123 }));
};
ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('收到服务器消息:', data);
};
ws.onerror = (error) => {
  console.error('WebSocket 错误:', error);
};

Server-Sent Events (SSE)(单向实时推送)

适用场景:新闻推送、股票价格更新、日志监控(服务器→客户端单向)。

服务器端如何向客户端发送消息?WebSocket实时通信原理

特点:基于 HTTP,只需客户端发起一次请求,服务器即可持续推送数据,比 WebSocket 轻量,但客户端无法主动通过该通道发送数据。

后端示例 (Node.js + Express)

app.get('/stream', (req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });
  // 定期发送消息
  const interval = setInterval(() => {
    const time = new Date().toISOString();
    res.write(`data: ${JSON.stringify({ time, message: 'Server time update' })}nn`);
  }, 1000);
  // 客户端断开时清理
  req.on('close', () => {
    clearInterval(interval);
  });
});

前端示例 (JavaScript)

const eventSource = new EventSource('/stream');
eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('收到 SSE 消息:', data);
};
eventSource.onerror = (error) => {
  console.error('SSE 错误:', error);
  eventSource.close();
};

HTTP 长轮询 (Long Polling)(兼容性好)

适用场景:不支持 WebSocket 的旧浏览器、防火墙严格限制的环境。
特点:客户端发起请求,服务器保持连接直到有新消息才响应,模拟实时效果,但开销较大。

后端示例 (Node.js)

const pendingRequests = [];
app.get('/poll', (req, res) => {
  // 将当前请求挂起
  pendingRequests.push(res);
  // 当有消息时,响应并移除请求
  const respond = (data) => {
    res.json(data);
    const index = pendingRequests.indexOf(res);

服务器端如何向客户端发送消息?WebSocket实时通信原理

if (index > -1) pendingRequests.splice(index, 1); }; // 设置超时,避免连接永远挂起 req.on('close', () => { const index = pendingRequests.indexOf(res); if (index > -1) pendingRequests.splice(index, 1); }); // 模拟:5秒后如果有新消息则响应 setTimeout(() => { if (pendingRequests.includes(res)) { respond({ message: 'New data!' }); } }, 5000); });

MQTT(物联网/移动优先)

适用场景:IoT 设备、移动 App、弱网环境。
特点:轻量级发布/订阅协议,节省带宽和电量。

后端示例 (Node.js + mqtt 库)

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.hivemq.com');
client.on('connect', () => {
  console.log('MQTT 连接成功');
  // 发布消息到主题 'news/update'
  client.publish('news/update', JSON.stringify({ title: 'Breaking News' }));
});

前端/客户端示例

client.subscribe('news/update');
client.on('message', (topic, message) => {
  console.log('收到 MQTT 消息:', message.toString());
});

轮询 (Short Polling)(最简单但效率最低)

适用场景:非实时、低频更新(如每 5 秒检查一次)。
特点:客户端定时发起 HTTP GET 请求,服务器返回最新数据。

// 前端
setInterval(async () => {
  const response = await fetch('/api/messages');
  const data = await response.json();
  console.log(data);
}, 5000);

方案对比与选择建议

特性 WebSocket SSE

服务器端如何向客户端发送消息?WebSocket实时通信原理

长轮询

MQTT短轮询
实时性
双向通信✅ 支持❌ 仅服务器→客户端❌ 仅客户端→服务器✅ 支持❌ 仅客户端→服务器
服务器开销中等低高低高
浏览器支持现代浏览器现代浏览器所有浏览器需库支持所有浏览器
防火墙友好一般✅ 好✅ 好一般✅ 好
适用场景聊天、游戏、协同新闻、股票、日志兼容旧系统IoT、移动 App简单状态检查

最佳实践建议

  1. 首选 WebSocket:如果需要双向、低延迟通信,WebSocket 是行业标准。
  2. 考虑降级:如果客户端可能不支持 WebSocket,可以使用 Socket.IO 等库自动降级到长轮询。
  3. 消息格式:始终使用 JSON 序列化消息,并定义清晰的消息结构(如 { type, payload, timestamp })。
  4. 心跳机制:在 WebSocket 和 SSE 中,实现心跳检测以处理断线重连。
  5. 安全性:
    • 使用 wss:// (WebSocket Secure) 和 https://。
    • 对消息进行身份验证和授权。
    • 防止 XSS 和注入攻击(尤其在前端解析消息时)。

根据你的具体需求选择合适的方案,如果需要进一步帮助(如具体框架集成),请提供更多信息!

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/479607.html

赞 (0)
服务器和客户端区别是什么,客户端和服务器通信原理
上一篇 2026年7月10日 10:21
服务器端如何给客户端发信息?服务端主动推送消息机制
下一篇 2026年7月10日 10:23

相关推荐

  • vLLM部署大模型显存占用过高怎么办?如何优化显存占用

    vLLM通过PagedAttention技术将显存碎片化问题降至最低,配合连续批处理,能在同等硬件下实现2-3倍的吞吐量提升,是降低大模型部署成本的最优解,在2026年的今天,大模型落地早已过了“能跑就行”的阶段,企业更关注的是如何在有限的GPU资源下跑出更高的性价比,很多团队在部署LLM时,常遇到显存溢出(O……

    2026年6月19日
    1900
  • 服务器哪个行业排名好?2026服务器行业排名最新出炉

    2026年服务器行业格局已定,阿里云、腾讯云、华为云凭借技术底座占据公有云市场前三,而浪潮、新华三则在传统IDC与混合云私有部署领域保持领先,企业选型需根据业务负载类型与数据合规要求精准匹配,服务器作为数字经济的“心脏”,其市场竞争早已从单纯的硬件参数比拼,转向算力效率、生态兼容性与服务响应的综合较量,对于正在……

    2026年7月7日
    15000
  • fortran ma是什么?fortran数组操作长尾词

    Fortran与MATLAB在科学计算领域各有千秋,若追求极致运算速度与大规模并行处理,Fortran是首选;若侧重快速原型开发、数据可视化及算法验证,MATLAB则更具优势,Fortran与MATLAB的核心定位差异在高性能计算(HPC)和工程仿真领域,fortran和matlab区别并非简单的“好坏”之分……

    2026年7月12日
    15500
  • ipvsadm如何开始使用?,ipvsadm怎么安装

    ipvsadm是Linux内核中IPVS模块的管理工具,用于配置四层负载均衡规则,是LVS(Linux Virtual Server)的核心组件,能在内核态直接转发数据包,性能远高于同场景下的用户态代理工具,ipvsadm是什么:内核态负载均衡的核心工具IPVS(IP Virtual Server)内置于Lin……

    2026年8月8日
    1100
  • IIS网站批量导入怎么操作,具体步骤有哪些?

    在IIS中批量导入网站,最稳定高效的办法是组合使用IIS自带的appcmd命令和PowerShell脚本, 如果你只是同版本迁移,用appcmd导出导入配置即可;如果涉及改动参数或跨IIS版本,用PowerShell循环创建更灵活,下面把三种主流实现方式以及它们各自的坑拆开讲,为什么需要iis网站批量导入工具在……

    2026年8月19日
    700
  • inetd服务器与普通服务器的主要区别是什么?,怎么配置?

    inetd服务器是Linux系统中最经典的超级守护进程,它通过统一监听多个网络端口并动态启动子进程,为服务器提供高效、节约资源的网络服务管理方案,在资源有限的早期Unix系统,inetd是标配,如今虽被xinetd或systemd取代,但理解inetd对维护遗留系统和优化网络架构依然重要,许多运维人员在处理老旧……

    2026年8月6日
    900
  • IDEA怎么连接MySQL数据库?,步骤是什么?

    在IntelliJ IDEA中连接MySQL数据库,核心是通过Database工具窗口配置JDBC驱动和连接信息,确保驱动版本匹配且防火墙放行3306端口, 下面从环境准备开始,逐一拆解配置步骤、常见报错及解决方案,帮你快速在IDEA中建立数据库连接,准备工作:确认环境与驱动在开始配置之前,需要确认MySQL服……

    AI资讯 2026年8月9日
    700
  • 服务器客户端怎么连接?服务器客户端连接方式有哪些

    服务器与客户端的连接本质上是基于TCP/IP协议的握手过程,核心在于IP地址、端口号及协议类型的正确配置,通常分为直连、代理连接及WebSocket长连接三种主流模式,在数字化基础设施日益复杂的今天,无论是开发分布式应用还是搭建私有云环境,理解服务器与客户端如何建立稳定连接是基础中的基础,很多初学者容易混淆“连……

    2026年7月11日
    3810
  • iar移植适配如何快速完成?,iar移植教程

    IAR移植适配并不复杂,核心在于统一编译器选项、处理硬件抽象层和优化链接脚本,只要掌握这三个关键点,就能高效完成跨平台或跨IDE的代码迁移, 很多工程师在接到移植任务时,第一反应是重新写一遍驱动,其实大可不必,IAR Embedded Workbench提供了完善的编译工具链和调试支持,只要做好配置对齐,大部分……

    2026年8月18日
    1200
  • 负载均衡搭建的详细步骤是什么?,有哪些注意事项?

    负载均衡搭建的核心是结合业务流量、预算和运维能力,选择最合适的软硬件方案,并正确配置健康检查和会话保持,负载均衡搭建方案对比:硬件负载均衡和软件负载均衡在选型阶段,多数团队会纠结于硬件和软件方案,两者在性能、成本、运维复杂度上差异明显,没有绝对好坏,只有场景匹配度,硬件负载均衡器的优缺点硬件方案的代表产品包括F……

    2026年7月23日
    500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注