网页接收服务端消息的几种方式

介绍

网页接收服务端消息,一般有如下几种方式

  • 直接轮询
  • WebSocket 长链接
  • 长轮询
  • Server send event

一、短轮询方式

前端页面按照时间间隔轮询拉取最新消息

缺点:

  • 实时性差!最长耗时等于时间间隔耗时
  • 没有消息也会有大量的请求,消耗服务器资源

优点:

  • 开发简单,可以快速实现功能

二、TCP 长链接 WebSocket 和 FlashSocket

  • WebSocket协议

WebSocket 协议

WebSocket 是一种全双工通信协议,建立在 TCP 之上,允许客户端(如浏览器)与服务器之间建立持久连接,实现双向实时数据传输。webSocket 解决了 Http 请求-响应模型无法实现服务器主动推送的问题。

特点:双向通信、持久链接、低延迟(数据帧小,无需每次携带头部)、原生支持(现代浏览器均原生支持)

链接:通过 Http 协议的 upgrade 方法建立 tcp 长链接

WebSocket 服务集群如何精确推送

方案 1:集中式连接管理 + 消息路由(推荐)
  • 每个服务节点维护自己当前连接的用户(如内存 Map:userId -> WebSocketSession)
  • 引入一个集中式存储(如 Redis、ETCD、ZooKeeper)记录“用户ID → 所在节点标识”的映射关系。
  • 发送消息时,先查集中存储,找到目标用户所在的节点,再通过节点间通信(如 RPC、消息队列)将消息路由到目标节点,由目标节点通过本地 WebSocket 推送。
方案 2:通过消息队列的消息广播
  • 所有节点订阅相同的 MQ 队列
  • 各个节点需要发送消息,只需要将消息发送到队列中
  • 各个节点消费消息时,只需判断对应的消息接受用户是否连接到本服务了,连接到本服务了则发送消息

FlashSocket 已被淘汰的历史产物

FlashSocket 并不是一个官方协议,而是在 Flash 时代,开发者利用 Adobe Flash 的 Socket API 实现的浏览器端 TCP 长连接方案,用于在 WebSocket 出现之前模拟“实时通信”。

诞生背景:

  • 2005~2012 年,浏览器原生不支持 WebSocket。
  • Flash Player 支持 TCP Socket,可绕过浏览器限制实现“伪长连接”。
  • 需要浏览器安装 Flash 插件 + 用户授权安全策略。

三、Http 长轮询

长轮询是在 WebSocket 普及之前,实现**“伪实时”**通信的一种经典方案。它通过“拉”模式模拟“推”效果:

客户端发起 HTTP 请求 → 服务器“hold 住”请求不立即返回 → 有新消息时才响应 → 客户端收到后立即再次发起新请求

客户端 服务器 │ │ ├─ 请求新消息 ─────────>│ │ │ │ │ ← 无消息?Hold 住连接(不返回) │ │ │ │ ← 有新消息到达!立即返回数据 │<──────── 响应消息 ────┤ │ │ ├─ 立即再次请求 ────────>│ │ │ │ │ ← 继续 hold 或返回...

与普通轮询(短轮询)对比

类型普通轮询长轮询
请求频率固定间隔(如每秒1次)有响应后立即重发
服务器压力高(频繁空请求)低(无消息时无响应)
实时性有延迟(取决于间隔)较高(消息到达即返回)
资源占用连接短,但频繁连接长,但数量可控

优点和缺点:

在现代项目中,优先使用 WebSocket;长轮询仅用于兼容性要求高或临时过渡场景。

** 优点:**

  • 兼容性好:所有浏览器都支持 HTTP。
  • 实现简单:无需特殊协议或插件。
  • 适合低频消息推送(如通知、订单状态变更)。

缺点:

  • 每次请求有 HTTP 头开销。
  • 服务器需维持大量挂起连接(消耗线程/内存)。
  • 不如 WebSocket 实时和高效。
  • 超时、断连需手动处理。

SpringBoot 案例

// MessageManager.java@ComponentpublicclassMessageManager{// 模拟每个用户的“消息阻塞队列”privatefinalMap<String,BlockingQueue<String>>userQueues=newConcurrentHashMap<>();// 获取用户队列(不存在则创建)privateBlockingQueue<String>getQueue(StringuserId){returnuserQueues.computeIfAbsent(userId,k->newLinkedBlockingQueue<>());}// 发送消息给用户publicvoidsendMessage(StringuserId,Stringmessage){BlockingQueue<String>queue=getQueue(userId);queue.offer(message);// 非阻塞放入}// 长轮询:等待消息(最多30秒)publicStringawaitMessage(StringuserId,longtimeoutMillis)throwsInterruptedException{BlockingQueue<String>queue=getQueue(userId);returnqueue.poll(timeoutMillis,TimeUnit.MILLISECONDS);// 阻塞等待}// 可选:清理用户队列(用户下线时调用)publicvoidremoveUser(StringuserId){userQueues.remove(userId);}}// LongPollingController.java@RestControllerpublicclassLongPollingController{@AutowiredprivateMessageManagermessageManager;/** * 长轮询接口:客户端调用,等待新消息 */@GetMapping("/long-polling")publicResponseEntity<String>longPolling(@RequestParamStringuserId){try{// 最多等待 30 秒Stringmessage=messageManager.awaitMessage(userId,30_000);if(message!=null){returnResponseEntity.ok(message);}else{returnResponseEntity.status(204).body("");// 204 No Content 表示超时无消息}}catch(InterruptedExceptione){Thread.currentThread().interrupt();returnResponseEntity.status(500).body("Interrupted");}}/** * 模拟发送消息接口(用于测试) */@GetMapping("/send")publicStringsendMessage(@RequestParamStringto,@RequestParamStringmsg){messageManager.sendMessage(to,msg);return"Message sent to "+to+": "+msg;}}

基于 Http 的 SSE 技术

七、WebSocket和SSE对比

基于Http的Server-Sent Events 技术

基于Http的Server-Sent Events 技术

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1141007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光谱共焦技术在高精度尺寸与3D表面缺陷检测中的工业应用研究

摘要&#xff1a;随着智能制造与精密工业的快速发展&#xff0c;对非接触、高精度、高速度的在线检测技术需求日益迫切。以海伯森技术推出的系列高端光学传感器深入剖析其基于光谱共焦位移测量与光谱共焦成像的核心原理。重点阐述该技术如何在微观尺度上实现纳米级精度的三维尺…

IP协议 地址划分MAC地址作用ip addr命令

一、ip addr命令解读 roottest:~# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 …

从用户需求到设计:提示工程架构师设计高效界面的方法

从用户需求到设计:提示工程架构师设计高效界面的方法 一、引入:当“AI翻译官”遇到“表达困境” 小张是一家美妆品牌的新媒体运营,每天的核心工作之一是用AI生成朋友圈文案。但她总陷入同一个循环: 写提示时,要么太笼统(“帮我写一条口红的朋友圈”),AI输出的内容千篇…

斯坦福大学等发布:AI助手在企业政策执行上“偏科“得如此严重

当我们谈论人工智能在企业中的应用时&#xff0c;大多数人可能会觉得这些AI助手就像一个全能的员工——既能帮助客户解答问题&#xff0c;又能严格按照公司规定行事。不过&#xff0c;斯坦福大学、POSTECH、BMW集团等多所知名机构的研究团队最近发现了一个令人意外的现象&#…

提示工程架构师推荐:社交网络提示设计的10个高效工具

社交网络提示设计&#xff1a;用10个工具搭建「用户主动互动」的底层逻辑 清晨7点&#xff0c;你揉着眼睛刷朋友圈&#xff0c;一条提示弹出来&#xff1a;「你关注的博主分享了『职场新人避坑指南』&#xff0c;朋友小王已经点赞&#xff0c;要不要看看&#xff1f;」你鬼使神…

交通仿真软件:Paramics_(4).网络创建与编辑

网络创建与编辑 1. 网络创建的基本步骤 在交通仿真软件Paramics中&#xff0c;网络创建是仿真过程的基础。一个准确的交通网络模型能够帮助仿真器更真实地反映交通状况。以下是网络创建的基本步骤&#xff1a; 1.1 导入基础地图启动Paramics软件&#xff1a;首先&#xff0c;打…

JVM 内存溢出和死锁检测

内存溢出案例 案例环境 案例代码 package com.hero.jvm.memory; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class TestJvmOutOfMemory {public static void main(String[] args) {List<Object> list new ArrayList<>();…

清华字节跳动首创视频换脸新纪元:让照片主角完美融入视频场景

这项由清华大学和字节跳动智能创作实验室联合开展的开创性研究于2026年1月发表&#xff0c;论文编号为arXiv:2601.01425v1。研究团队开发了一套名为DreamID-V的全新视频换脸技术框架&#xff0c;首次实现了将单张照片中的人物身份完美融入到任何视频场景中&#xff0c;同时保持…

交通仿真软件:Paramics_(5).交通流仿真

交通流仿真 1. 交通流仿真的基础概念 交通流仿真是一种通过计算机模拟技术来研究和分析交通系统运行情况的方法。它可以帮助交通规划师、工程师和研究人员了解交通系统在不同条件下的行为&#xff0c;从而优化交通设计、管理和控制。Paramics 是一款功能强大的交通仿真软件&…

阿尔伯塔大学新突破:让AI学会自我检查错误,准确率远超人工审核

这项由加拿大阿尔伯塔大学的Amirhosein Ghasemabadi和Di Niu教授领导的研究发表于2026年1月的arXiv预印本服务器&#xff0c;论文编号为2512.20578v2&#xff0c;有兴趣深入了解的读者可以通过该编号查询完整论文。现在的人工智能聊天机器人就像一个极其博学但有时会胡说八道的…

交通仿真软件:Paramics_(3).交通网络建模基础

交通网络建模基础 1. 交通网络的基本概念 交通网络是交通仿真中的基础组成部分&#xff0c;它描述了道路、交叉口、车道、交通信号等交通设施的布局和连接关系。在Paramics中&#xff0c;交通网络的建模是通过一系列工具和步骤来完成的。本节将介绍交通网络的基本概念&#xff…

交通仿真软件:Paramics_(3).数据输入与处理

数据输入与处理 在交通仿真软件中&#xff0c;数据输入与处理是至关重要的步骤。这一部分将详细介绍如何在Paramics中输入和处理各种交通数据&#xff0c;包括路网数据、交通流量数据、车辆数据等。我们将通过具体的例子来说明这些数据的输入方法和处理技巧。 路网数据输入 路网…

上海交大突破:单一AI模型实现全视觉创作任务

这项由上海交通大学的陈俊逸、何通等研究者与快手科技Kling团队、南洋理工大学合作完成的研究发表于2026年1月&#xff0c;论文编号为arXiv:2601.02358v1。对于想要深入了解技术细节的读者&#xff0c;可以通过这个编号在学术数据库中查询完整论文。在当今的AI时代&#xff0c;…

交通仿真软件:Paramics_(2).交通仿真基础理论

交通仿真基础理论 在上一节中&#xff0c;我们介绍了交通仿真的基本概念和应用领域。接下来&#xff0c;我们将深入探讨交通仿真软件的基础理论&#xff0c;这些理论是理解交通仿真软件如何工作的关键。本节将涵盖以下几个方面&#xff1a; 1. 交通流理论 交通流理论是交通仿真…

从案例到技巧:Agentic AI提示设计的实战总结(提示工程架构师版)

好的&#xff0c;技术架构师&#xff01;基于您提供的主题&#xff0c;我为您精心构思一篇面向**具备基础提示工程知识、致力于构建复杂可靠Agent系统的高级用户&#xff08;如提示工程架构师、技术负责人、高级AI工程师&#xff09;**的实战深度总结文章。文章将聚焦可落地的设…

交通仿真软件:Aimsun_(21).交通仿真中的数据分析

交通仿真中的数据分析 数据导入与预处理 在交通仿真软件Aimsun中&#xff0c;数据的导入与预处理是进行仿真分析的第一步。这一部分将详细介绍如何从各种数据源导入数据&#xff0c;并进行必要的预处理&#xff0c;以便在仿真模型中使用。 1. 数据源概述 Aimsun支持多种数据源&…

【图像加密】基于matlab混沌系统和DNA编码图像加密解密【含Matlab源码 14898期】含论文

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

这款甘特图我愿称之为2026年最强!免费开源太良心![特殊字符]

作为一个项目管理老鸟&#xff0c;我对甘特图工具可太挑剔了&#xff01;2026年了&#xff0c;市面上的甘特图工具卷得飞起&#x1f631; 我把目前热门的6款在线甘特图都体验了一遍&#xff0c;功能、易用性、价格全方位对比&#xff01;最后选出的这款&#xff0c;真的绝绝子&…

基于C++的《Head First设计模式》笔记——抽象工厂模式

目录 一.专栏简介 二.依赖很强的代码 三.对象依赖 四.依赖倒置原则 五.应用原则 六.依赖倒置原则中&#xff0c;“倒置”在哪&#xff1f; 七.帮助我们遵循该原则的几条指南 八.原料工厂 九.重做披萨 十.我们做了什么 十一.定义抽象工厂 十二.比较工厂方法和抽象工厂…

读懂 sap.m.URLHelper 文档里的 library: sap.m 与 Module: sap/m/library

你在 SAP UI5 API Reference 里看到的这两个字段&#xff0c;看起来都在讲 sap.m&#xff0c;但它们回答的是两类完全不同的问题&#xff1a; library: sap.m&#xff1a;这条 API 属于哪个 UI5 库&#xff08;library 维度&#xff1a;交付、依赖、主题、预加载等的组织单位&…