当前位置: 首页 > article >正文

苍穹外卖day10(黑马程序员)

苍穹外卖 day10 笔记WebSocket什么是 WebSocketWebSocket是一种全双工的网络通信方式客户端和服务器建立连接之后双方都可以随时主动给对方发消息不必像传统网页那样「每次都要重新发起一次请求」。可以把它理解成HTTP像发短信——你问一句对方答一句想再问再发一条。WebSocket像打电话——线路接通后两边随时说话不用每句话都重新拨号。在技术上的要点连接一般从一次HTTP 升级握手开始浏览器先发带Upgrade: websocket的请求服务器同意后同一条 TCP 连接就升级为 WebSocket之后在这条连接上传 WebSocket 帧。数据以帧frame为单位传输开销比反复建连的 HTTP 要小适合高频、实时场景聊天、订单状态推送、大屏数据刷新等。WebSocket 和 HTTP 的区别对比项HTTPWebSocket通信模型主要是请求—响应客户端发起服务器返回一次交互通常结束长连接 双向建立后客户端、服务器都能主动推送连接方式常用短连接HTTP/1.1 可 keep-alive但语义仍是「一次请求一次响」先握手再长连连接保持打开谁先发几乎总是客户端先请求建立后服务端也可主动往客户端发实时性要靠轮询定时请求或 SSE 等折中方案才有「伪实时」天然适合实时推送头部开销每次请求常带较多 HTTP 头握手后帧头相对小适合频繁小消息典型场景打开网页、REST 接口、表单提交在线客服、即时通知、协同编辑、实时行情一句话HTTP 适合「拿资源、调接口」WebSocket 适合「连着不断互相推消息」的实时通信。packagecom.sky.websocket;importorg.springframework.stereotype.Component;importjavax.websocket.OnClose;importjavax.websocket.OnMessage;importjavax.websocket.OnOpen;importjavax.websocket.Session;importjavax.websocket.server.PathParam;importjavax.websocket.server.ServerEndpoint;importjava.util.Collection;importjava.util.HashMap;importjava.util.Map;/** * WebSocket服务 */ComponentServerEndpoint(/ws/{sid})publicclassWebSocketServer{//存放会话对象privatestaticMapString,SessionsessionMapnewHashMap();/** * 连接建立成功调用的方法 */OnOpenpublicvoidonOpen(Sessionsession,PathParam(sid)Stringsid){System.out.println(客户端sid建立连接);sessionMap.put(sid,session);}/** * 收到客户端消息后调用的方法 * * param message 客户端发送过来的消息 */OnMessagepublicvoidonMessage(Stringmessage,PathParam(sid)Stringsid){System.out.println(收到来自客户端sid的信息:message);}/** * 连接关闭调用的方法 * * param sid */OnClosepublicvoidonClose(PathParam(sid)Stringsid){System.out.println(连接断开:sid);sessionMap.remove(sid);}/** * 群发 * * param message */publicvoidsendToAllClient(Stringmessage){CollectionSessionsessionssessionMap.values();for(Sessionsession:sessions){try{//服务器向客户端发送消息session.getBasicRemote().sendText(message);}catch(Exceptione){e.printStackTrace();}}}}代码逐行讲解含注释含义包与导入行内容说明package com.sky.websocket;类放在websocket包下和业务里的 WebSocket 放一起。Component相关org.springframework.stereotype.Component把该类交给Spring 容器管理便于别的 Bean 注入WebSocketServer例如来单后调用sendToAllClient。OnOpen/OnMessage/OnCloseJSR-356Java WebSocket API里的注解分别标记「连接打开」「收到消息」「连接关闭」时要调的方法。Session表示和某一个客户端的那条 WebSocket 会话用来发消息、关连接。PathParam从路径里取变量和ServerEndpoint(/ws/{sid})里的{sid}对应。ServerEndpoint声明这是一个WebSocket 服务端端点括号里是访问路径相对应用根路径实际完整地址还取决于是否配置了 context-path。Collection/HashMap/MapsessionMap用Map存「业务 id → Session」方便按人管理、群发时遍历。类上的注解与类注释内容说明/** WebSocket服务 */类注释说明这个类负责提供 WebSocket 服务。ComponentSpring 扫描后注册为 Bean注意若用 JDK 自带ServerEndpoint 内嵌 Tomcat有时还要配ServerEndpointExporter课程里一般会一起讲。ServerEndpoint(/ws/{sid})连接地址形如/ws/某个sid例如/ws/1sid常用来区分客户端如用户 id、门店 id方便日志和sessionMap的 key。sessionMap与注释「存放会话对象」//存放会话对象privatestaticMapString,SessionsessionMapnewHashMap();注释含义这里不是用来存「聊天内容」而是存当前已连接上的每一个客户端会话。static所有WebSocketServer实例共享同一张表因为ServerEndpoint每连接可能对应不同实例用 static 才能保证「全站会话」在一起群发才找得到所有人。keyString sid路径里的sid用来标识是谁连上来了。valueSession和该客户端通信用的对象发消息要用它。onOpen— 注释「连接建立成功调用的方法」OnOpenpublicvoidonOpen(Sessionsession,PathParam(sid)Stringsid){OnOpen浏览器/前端new WebSocket(url)握手成功后容器会调这个方法。Session session当前这条连接的会话对象。PathParam(sid) String sid从 URL/ws/{sid}里解析出的那一段例如连的是/ws/admin1则sid为admin1。System.out.println(客户端sid建立连接);sessionMap.put(sid,session);打日志谁连上了。put(sid, session)把「这个 sid」和「这条 Session」绑定后面群发或按人发都要靠这张表。onMessage— 注释「收到客户端消息后调用的方法」/** * 收到客户端消息后调用的方法 * * param message 客户端发送过来的消息 */OnMessagepublicvoidonMessage(Stringmessage,PathParam(sid)Stringsid){OnMessage该客户端发来一段文本时触发这里按String接收文本帧。message客户端发的字符串内容Javadoc 注释已说明。sid仍是路径上的 id表示是谁发的。System.out.println(收到来自客户端sid的信息:message);仅打印若要做「回显、广播、业务处理」可在这里加逻辑。onClose— 注释「连接关闭调用的方法」/** * 连接关闭调用的方法 * * param sid */OnClosepublicvoidonClose(PathParam(sid)Stringsid){OnClose连接断开用户关页面、网络断了、服务端关连接等时调用。这里只传了sid没有Session因为连接已断通常只需从 map 里删掉避免内存泄漏和向已死连接发消息。System.out.println(连接断开:sid);sessionMap.remove(sid);从sessionMap移除注释对应关系「连接关闭」→ 不再保留该会话。sendToAllClient— 注释「群发」/** * 群发 * * param message */publicvoidsendToAllClient(Stringmessage){业务方法不是 WebSocket 生命周期注解给当前所有在线客户端发同一条文本。message要广播的内容Javadoc 里的param message即此意。一般由Service在「新订单来了」时注入WebSocketServer后调用。CollectionSessionsessionssessionMap.values();for(Sessionsession:sessions){try{//服务器向客户端发送消息session.getBasicRemote().sendText(message);sessionMap.values()取出所有在线Session。注释「服务器向客户端发送消息」表示这里是服务端主动推送相对onMessage的「客户端发来」。getBasicRemote().sendText(message)同步方式向该 Session 发一段文本若要多线程并发发可考虑getAsyncRemote()课程里常用BasicRemote即可。}catch(Exceptione){e.printStackTrace();}}}某个连接已失效仍留在 map 里时sendText可能抛异常catch后打印避免一条失败导致后面人都收不到可根据需要再remove无效 session。小结对照注释注释/注解一句话WebSocket服务本类职责处理 WebSocket 连接与推送。存放会话对象Map 里是在线客户端的Sessionkey 为sid。连接建立成功调用的方法onOpen登记会话。收到客户端消息后调用的方法onMessage处理客户端上行文本。连接关闭调用的方法onClose移除会话。群发sendToAllClient对所有在线连接sendText。服务器向客户端发送消息在循环里用Session向浏览器推送。客户催单模块Controller层/** * 客户催单 * param id * return */GetMapping(/reminder/{id})ApiOperation(用户订单催单)publicResultreminder(PathVariable(id)Longid){orderService.reminder(id);returnResult.success();}Service层Overridepublicvoidreminder(Longid){//根据id查询订单OrdersordersorderMapper.getById(id);if(ordersnull){thrownewOrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);}MapmapnewHashMap();map.put(type,2);//1:表示来单提醒2表示客户催单map.put(orderId,id);map.put(content,订单号orders.getNumber());StringjsonJSONObject.toJSONString(map);WebSocketServer.sendToAllClient(json);}根据传回来的orders的对象解析里面的orderId然后转换成json格式最后传递给WebSocketServer实现群发的功能

相关文章:

苍穹外卖day10(黑马程序员)

苍穹外卖 day10 笔记 WebSocket 什么是 WebSocket WebSocket 是一种全双工的网络通信方式:客户端和服务器建立连接之后,双方都可以随时主动给对方发消息,不必像传统网页那样「每次都要重新发起一次请求」。 可以把它理解成: HTTP&…...

2026经管大洗牌!只会记账/理论已死,再不考这10个证,迟早被AI取代!

2026经管行业变革与核心证书指南随着AI技术的快速发展,传统经管岗位面临巨大挑战。单纯掌握记账或理论知识的从业者可能面临淘汰风险。以下为未来五年内最具价值的10项认证,帮助从业者保持竞争力。CDA数据分析师证书的核心优势CDA数据分析师证书由国际数…...

WaveTools:解决鸣潮玩家性能优化与数据管理痛点的开源工具

WaveTools:解决鸣潮玩家性能优化与数据管理痛点的开源工具 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》PC玩家设计的开源辅助工具,集成性能优化、账…...

Linux内核设计哲学:你我承载力的艺术(续)

第七部:设备驱动——与不完美的世界和解7.1 你不是主人,你是仆人设备驱动是内核中最“卑微”的组件。它不和用户直接打交道,不参与核心决策,甚至不拥有任何资源。它只是硬件的翻译官——把内核的标准请求翻译成硬件能懂的指令&…...

Thorium浏览器:为什么这个基于Chromium的优化版本能解决你90%的性能痛点?

Thorium浏览器:为什么这个基于Chromium的优化版本能解决你90%的性能痛点? 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, lin…...

5个维度教你掌握游戏自动化与效率工具开发

5个维度教你掌握游戏自动化与效率工具开发 【免费下载链接】JX3Toy 一个自动化测试DPS的小工具 项目地址: https://gitcode.com/GitHub_Trending/jx/JX3Toy 在游戏开发与玩家体验优化领域,游戏脚本开发正成为提升效率的关键技术。本文将系统介绍一款开源项目…...

水箱水位监测控制电路 Multisim 仿真探索

Multisim仿真文件 水箱水位监测控制电路报告 包含:说明书,Multisim10电路源文件,仿真电路等 仿真效果: 1.在水箱内的不同高度安装3根金属棒,以感知水位变化情况, 液位分1,2,3档&…...

山西口碑好的实体店获客公司哪家可靠

在山西,实体店主们都在为如何有效获客而烦恼。随着市场竞争的加剧,选择一家可靠的获客公司至关重要。今天,我们就来探讨一下山西口碑好的实体店获客公司,重点介绍中谷云(厦门)大数据科技有限公司&#xff0…...

覆盖更远、组网更稳:基于 EFR32BG21 的智能家居与物联网 BLE Mesh 无线模块方案

智能家居与物联网设备越来越多,但真正决定体验上限的往往不是“有没有连上网”,而是信号能不能到、掉线后能不能自愈、多设备同时在线是否还稳定。单靠点对点蓝牙,很容易在隔墙、远距离、多节点场景里碰到瓶颈;而把低功耗蓝牙与 M…...

5分钟掌握ImStudio:免费高效的实时GUI布局设计终极方案

5分钟掌握ImStudio:免费高效的实时GUI布局设计终极方案 【免费下载链接】ImStudio Real-time GUI layout designer for Dear ImGui 项目地址: https://gitcode.com/gh_mirrors/im/ImStudio 你是否曾经为调试用户界面而反复编译代码?是否厌倦了在代…...

不只是“生成一张图“:2026年6款真正改变设计工作流的AI界面工具深度测评

AI界面生成工具正在经历从"生成单张界面"到"生成完整产品体验"的代际跃迁。本文深度拆解 UXbot、Figma Make、Google Stitch、Flowstep、Visily AI 和 Moonchild 共6款2026年代表性工具——从设计稿生成到原生代码输出,覆盖完整的产品交付能力谱…...

如何快速修复ROG游戏本色彩配置文件丢失问题:G-Helper终极指南

如何快速修复ROG游戏本色彩配置文件丢失问题:G-Helper终极指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, S…...

AI生成教材新玩法,低查重让你的教材更有竞争力!

教材的格式问题常常让编写者感到困惑。比如,标题应该选择多大字号?参考文献是依据GB/T7714还是按照某些出版机构的标准?习题的排版又应选择单栏还是双栏?各种不同的要求让人感到眼花缭乱,而手动调整不仅耗时费力&#…...

做对这三步,拥有一个聪明的智能问数与分析Agent

这两年,智能问数与分析,几乎已经成了 ToB Agent 里最容易出圈的“爆款场景”。原因不难理解。相比很多还停留在演示层、流程层的 AI 应用,智能问数更接近企业管理者最直接的需求:我有问题,系统能不能立刻给我答案&…...

本科论文知网AI率高的原因和解决方法全在这里

知网AIGC检测出来AI率高,很多同学第一反应是"我没有全程用AI写啊,为什么这么高?"这个问题确实需要好好解释一下——知网检测到的AI率高,未必是因为你完全靠AI写的。 知网AIGC检测是怎么工作的 知网的AIGC检测系统会分…...

本科论文降AI率花多少钱合适?各档工具对比

每年毕业季都有同学问:降AI率要花多少钱?买个工具值不值?这篇把费用账算清楚,让你心里有数。 先算清楚你实际需要处理多少字 很多人有个误区,以为论文AI率30%就要处理30%的字数。实际上不是的。 实际需要处理的字数…...

**发散创新:基于Python与OpenCV的智能交通流量实时监测系统设计

发散创新:基于Python与OpenCV的智能交通流量实时监测系统设计与实现 在智慧城市建设不断深化的背景下,智能交通系统(ITS) 正成为城市治理现代化的重要突破口。传统的交通信号控制多依赖固定时长或人工经验判断,难以应对…...

数仓实习实战|医疗报表电话指标缺失,完整上游排查思路

今天碰到一个问题:患者档案里明明有联系电话,但是最终报表展示的时候,这个字段就是空的。跟着师哥一步步排查下来,思路清晰了很多,也把完整的排查逻辑整理了一下,以后遇到类似问题可以直接参考一、问题场景…...

开篇:高并发下MySQL主从延迟的挑战与诊断全景图

开篇:高并发下MySQL主从延迟的挑战与诊断全景图 凌晨三点,监控告警炸了。主库QPS冲到两万八,从库延迟曲线像坐了火箭——三分钟前还是秒级延迟,现在稳定在三百秒高位。业务侧已经出现数据不一致的客诉,运营群开始@全体成员。你揉着发红的眼睛,连上从库执行SHOW SLAVE STA…...

[WP]vulhub-dc1 flag全收集,靶机通关writeup超级详细,附带知识点讲解

2026/3/28 前言/提示: 本次记录的背景是作者本人积累2年多的基础知识,但是从来没有打过这种集成环境的靶机,所以仅供个人参考,尽管真的很想分享一些自己的思路也许能帮助读者,但是本次记录也大概率会出现手法惊奇&am…...

RHCSA 认证必备:目录文件的管理

目录 一、创建目录 (1)格式 (2)参数 (3)示例 二、查看目录文件 1、查看目录文件 2、统计命令 3、编辑与删除 a.编辑目录文件 b.删除目录文件 一、创建目录 (1)格式 mkdi…...

2026届毕业生推荐的五大AI科研神器实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在运用人工智能辅助写作这个行为当中,所生成的内容常常带有十分明显的机械感。所…...

2025届必备的六大AI科研神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 专门用于降低重复率的网站,在学术范畴里,是作为辅助学术写作的工具而…...

风冷机房温湿度数据采集解决方案

对部分气候干旱的地区来说,使用风冷技术对数据机房进行冷却是比较合适的方案,但高能耗问题仍需要避免与管控,要求环境温湿度与散热效率进行合理分配。对此,物通博联提供温湿度数据采集到机房管理平台的解决方案。 需求如下 温湿度…...

2025届最火的十大AI写作工具实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术写作这个特定的场景之内,精确地挑选恰当的AI论文平台,能够极其…...

2025届最火的五大降AI率平台横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 一款基于自然语言处理技术的智能工具,是AI写作软件,它能够辅助用户自…...

计算机毕业设计:Python汽车销量智能可视化与预测系统 Flask框架 可视化 机器学习 AI 大模型 大数据(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

计算机毕业设计:Python地铁数据可视化分析系统 Flask框架 数据分析 可视化 高德地图 数据挖掘 机器学习 爬虫(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

欧洲发布Euro-Office引发OnlyOffice强烈抗议

欧洲企业Ionos和Nextcloud联合推出了Euro-Office,这是基于OnlyOffice云办公套件的分支版本,专为对数字主权有顾虑的组织而设计,此举引发了原开发商的愤怒回应。几天前,以德国自托管云服务商Nextcloud为首的"欧洲企业和社区组…...

OpenClaw 从翻车到迎来上百项更新:MiniMax、腾讯、阿里、有道 8 位专家拆解OpenClaw本土化实战解法

责编 | 梦依丹出品 | CSDN(ID:CSDNnews)3 月 24 日,行业顶流 OpenClaw 在迎来号称自诞生以来的最大更新之后,却始料未及地上演了一段“装虾五分钟,修 Bug 两小时”的升级翻车大事故。由于强行将插件生态迁移…...