服务器端如何向客户端发送消息?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://test.idctop.com/article/479607.html

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

相关推荐

  • Redis分布式缓存怎么学?Redis缓存穿透解决方案

    针对分布式缓存Redis的学习,建议优先选择《Redis设计与实现》深入底层原理,搭配《Redis实战》掌握高频场景应用,并结合官方文档进行代码实操,这是目前业内公认最高效的知识构建路径,在2026年的技术生态中,Redis早已超越了简单的键值存储工具范畴,成为构建高并发、低延迟系统的核心基础设施,对于开发者而……

    2026年7月6日
    14400
  • 大模型部署效果差怎么办?如何评估大模型部署效果

    大模型部署的核心不在于“能不能跑”,而在于“稳不稳”和“省不省”,通过量化推理延迟、吞吐量及显存占用,结合量化压缩与推理加速框架,是平衡效果与成本的关键路径,很多企业在引入大模型时,往往陷入一个误区:认为只要把开源模型下载下来,扔进服务器就能直接商用,事实并非如此,从实验室环境到生产环境,中间隔着巨大的工程鸿沟……

    AI资讯 2026年6月18日
    2310
  • 博士ai大模型好用吗?2026最新评测与使用教程

    博士AI大模型并非单一软件,而是基于前沿深度学习架构构建的智能决策系统,其核心价值在于通过自然语言处理与多模态技术,为企业和个人提供从数据洞察到自动化执行的全链路解决方案,在2026年的数字生态中,单纯的工具属性已不足以支撑竞争力,我们正处在一个“智能体”(Agent)广泛普及的时代,用户不再满足于简单的问答……

    2026年6月16日
    2500
  • IPFS云存储数据怎么查询,IPFS云存储优势有哪些?

    IPFS云存储设备大数据库,本质是一个记录全球IPFS存储节点(设备)信息与存储内容状态的“超级黄页”;它能让你快速找到靠谱设备、验证存储内容、监控存储状态,是确保数据安全存储与高效取回的关键基础设施,IPFS云存储设备大数据库是什么?一个“超级黄页”的诞生它不是一个具体的网站或App,而是一个建立在IPFS协……

    2026年8月1日
    200
  • flash网站制作怎么做?flash网站制作教程

    Flash 网站制作”,首先需要明确一个极其重要的技术现状:Adobe Flash Player 已于 2020 年 12 月 31 日正式停止支持,所有主流浏览器(Chrome, Firefox, Edge, Safari 等)均已禁用 Flash 插件,现在制作新的网站,绝对不应该使用 Flash (.sw……

    2026年7月10日
    17300
  • 如何优化IO和Cache/IO?, 怎么做

    IO优化的核心不在于盲目增加缓存,而在于理解业务IO模型并匹配对应的缓存策略,否则缓存可能成为新的瓶颈,理解IO与缓存的协作关系IO请求的完整路径一次IO请求从应用发起,经过语言运行时库、操作系统VFS层、文件系统、块设备层,最终到达磁盘,你可能会发现,即使换了NVMe盘,应用依然卡顿,问题往往出在中间环节的缓……

    2026年8月4日
    600
  • 国内大厂ai大模型哪家强?2026最新排行榜

    国内大厂AI大模型已形成“百模大战”后的格局收敛,2026年主流选择应基于具体业务场景,如企业级私有化部署首选百度文心一言或阿里通义千问,内容创作侧重快手可灵或腾讯混元,而追求极致性价比与开源生态则聚焦智谱GLM或月之暗面Kimi,国内主流大模型阵营深度解析随着算力基础设施的完善和算法迭代,国内AI大模型市场已……

    2026年6月15日
    9510
  • index of 网站显示_index

    网站出现“Index of /”目录列表通常是因为服务器开启了目录浏览功能,这不仅会暴露网站结构,还可能影响SEO排名和安全性,及时关闭目录列表并处理已收录页面,是提升网站安全与SEO表现的关键一步,为什么网站会显示index of 目录列表服务器配置不当导致目录列表开启大多数Web服务器都内置了目录浏览功能……

    2026年8月21日
    400
  • iis express域名怎么绑定?,安装iis怎么操作

    在IIS Express中绑定自定义域名只需修改配置文件,而安装IIS则可通过控制面板或命令行快速完成,两者分别适用于开发调试和生产部署场景,iis express 域名绑定步骤详解本地开发时使用自定义域名访问站点,能更真实模拟线上环境,IIS Express的域名绑定主要依靠修改配置文件,找到并修改appli……

    2026年8月7日
    200
  • 分布式数据库能优化MySQL吗?MySQL优化方案有哪些

    分布式数据库并非简单的MySQL扩容方案,而是通过分片、读写分离及多副本机制,解决单机MySQL在海量数据与高并发场景下的性能瓶颈与单点故障问题,当业务体量突破单机MySQL的物理极限时,传统的垂直扩展(Scale-up)往往面临硬件成本指数级上升且性能边际效应递减的困境,引入分布式架构成为技术选型的必然选择……

    2026年7月7日
    5200

发表回复

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