2026/4/9 4:48:09
网站建设
项目流程
网站建设与管理的实训,河北衡水网站建设,怎么做网站的关键词,高端菜单设计制作介绍
网页接收服务端消息#xff0c;一般有如下几种方式
直接轮询WebSocket 长链接长轮询Server send event
一、短轮询方式
前端页面按照时间间隔轮询拉取最新消息
缺点#xff1a;
实时性差#xff01;最长耗时等于时间间隔耗时没有消息也会有大量的请求#xff0c…介绍网页接收服务端消息一般有如下几种方式直接轮询WebSocket 长链接长轮询Server send event一、短轮询方式前端页面按照时间间隔轮询拉取最新消息缺点实时性差最长耗时等于时间间隔耗时没有消息也会有大量的请求消耗服务器资源优点开发简单可以快速实现功能二、TCP 长链接 WebSocket 和 FlashSocketWebSocket协议WebSocket 协议WebSocket 是一种全双工通信协议建立在 TCP 之上允许客户端如浏览器与服务器之间建立持久连接实现双向实时数据传输。webSocket 解决了 Http 请求-响应模型无法实现服务器主动推送的问题。特点双向通信、持久链接、低延迟(数据帧小无需每次携带头部)、原生支持(现代浏览器均原生支持)链接通过 Http 协议的 upgrade 方法建立 tcp 长链接WebSocket 服务集群如何精确推送方案 1集中式连接管理 消息路由推荐每个服务节点维护自己当前连接的用户如内存 MapuserId - 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.javaComponentpublicclassMessageManager{// 模拟每个用户的“消息阻塞队列”privatefinalMapString,BlockingQueueStringuserQueuesnewConcurrentHashMap();// 获取用户队列不存在则创建privateBlockingQueueStringgetQueue(StringuserId){returnuserQueues.computeIfAbsent(userId,k-newLinkedBlockingQueue());}// 发送消息给用户publicvoidsendMessage(StringuserId,Stringmessage){BlockingQueueStringqueuegetQueue(userId);queue.offer(message);// 非阻塞放入}// 长轮询等待消息最多30秒publicStringawaitMessage(StringuserId,longtimeoutMillis)throwsInterruptedException{BlockingQueueStringqueuegetQueue(userId);returnqueue.poll(timeoutMillis,TimeUnit.MILLISECONDS);// 阻塞等待}// 可选清理用户队列用户下线时调用publicvoidremoveUser(StringuserId){userQueues.remove(userId);}}// LongPollingController.javaRestControllerpublicclassLongPollingController{AutowiredprivateMessageManagermessageManager;/** * 长轮询接口客户端调用等待新消息 */GetMapping(/long-polling)publicResponseEntityStringlongPolling(RequestParamStringuserId){try{// 最多等待 30 秒StringmessagemessageManager.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);returnMessage sent to to: msg;}}基于 Http 的 SSE 技术七、WebSocket和SSE对比基于Http的Server-Sent Events 技术基于Http的Server-Sent Events 技术