服务器端如何向客户端发送消息?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

相关推荐

  • Filezilla客户端连不上服务器怎么办?如何配置FTP服务器

    FileZilla 是一款广泛使用的开源 FTP、SFTP 和 FTPS 客户端软件,它既可以作为客户端连接到远程服务器,也可以配置为本地服务器(较少见,通常用于内网文件共享),以下是关于 FileZilla 客户端 和 服务器端 的详细说明,包括连接方式、配置步骤和常见问题,FileZilla 客户端(Cli……

    2026年7月11日
    3300
  • ipv4ipv6双栈到底有什么用?,认证文件有什么用途?

    IPv4/IPv6双栈的核心价值在于让一台设备同时跑两套网络协议,而认证文件则是运营商或机构给设备“验明正身”的电子通行证,没有这张凭证,系统即使开了双栈,也无法获取IPv6地址并正式上网,IPv4和IPv6双栈有什么区别?为什么说它是过渡期的标准答案双栈不是“二选一”,而是“全都要”,一台路由器、服务器或者家……

    2026年8月17日
    400
  • 如何检查IB云服务器的网络是否正常?,怎么解决?

    检查IB云服务器网络是否正常,核心是看链路状态、连通性和实际带宽三项,缺一不可,下面这套方法,从基础命令到性能测试,帮你一步步定位问题,先分清你查的是哪种“IB网络”IB云服务器和普通ECS不一样,它除了常规的以太网管理口,还有一张独立的InfiniBand网卡,走的是RDMA协议,平时说的“IB网络检查”,指……

    2026年8月10日
    1000
  • 服务器如何挂存储?服务器挂载存储详细教程

    服务器挂载存储的核心在于通过iSCSI、FC或NFS等协议建立连接,并在操作系统层面识别、格式化及挂载存储卷,实现数据读写,在现代数据中心架构中,服务器与存储设备的分离已成为绝对主流,这种分离带来了灵活性,但也让“如何挂存储”成为了运维人员最基础却最容易出错的环节,很多新手往往认为这只是插根线那么简单,从物理连……

    2026年7月5日
    18800
  • Windows10怎么做iSCSI服务器,怎么配置?

    在Windows 10上搭建iSCSI服务器,推荐使用StarWind免费版或iSCSI Target软件,配置简单且稳定,适合家庭或小型办公环境,相比Windows Server方案,第三方工具无需额外系统成本,且性能足以满足日常需求,为什么要在Windows 10上搭建iSCSI服务器?很多用户手头只有普通……

    2026年8月12日
    500
  • 如何修改服务器远程连接地址密码,有哪些注意事项?

    服务器远程连接地址密码修改的核心是同步修改操作系统配置、安全组规则和防火墙策略,并立即验证新连接的可用性,否则极易导致无法远程登录,为什么需要修改服务器远程连接地址和密码?默认的远程连接端口(如Linux的22、Windows的3389)是全网扫描的重点目标,配合弱密码,服务器被暴力破解的风险极高,行业共识认为……

    2026年7月23日
    300
  • instanceof是什么?,java中这个关键字怎么用?

    instanceof关键字是Java中用于判断对象是否为某个特定类或接口实例的运算符,它返回布尔值,是类型安全编程和运行时类型检查的核心工具,instanceof关键字是什么?如何工作?instanceof关键字在Java中扮演着“类型检测员”的角色,你在编写代码时,经常需要确认一个对象究竟属于哪个类,或者是否……

    2026年8月6日
    300
  • 3d模型ai大模型怎么用?3d模型ai大模型哪个好用

    3D模型AI大模型通过深度学习技术实现了从文本描述到三维几何体、纹理及材质的自动化生成,大幅降低了3D内容创作门槛,是2026年数字内容生产的核心生产力工具,曾经,制作一个高质量的3D角色或场景需要建模师耗费数周时间进行布线、贴图和解算,借助3D模型AI大模型,创作者只需输入一段详细的文字提示词,甚至是一张简单……

    2026年6月15日
    4900
  • 发送短信验证平台哪家好一些,怎么选最靠谱

    选择短信验证平台,核心是看送达率、稳定性和价格,对于多数业务场景,建议优先考虑有工信部资质和自建通道的头部服务商,短信验证码平台哪家好?选择标准全解析面对市面上几十家短信服务商,筛选出靠谱的平台并不容易,业内专家指出,评估一个短信验证码平台的好坏,需要从四个维度逐个过筛:通道质量、接口能力、价格体系和售后服务……

    2026年7月27日
    700
  • 服务器端和客户端如何联网?电脑连不上网络怎么办

    服务器端和客户端的联网通信是计算机网络应用的核心,客户端(Client) 是发起请求的一方(如你的浏览器、手机App),而 服务器端(Server) 是等待并响应请求的一方(如网站背后的数据库、API服务),它们通过 网络协议 进行通信,以下是联网通信的基本原理、常用协议和实现步骤:核心原理:请求-响应模型(R……

    2026年7月10日
    2400

发表回复

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