苍穹外卖(八) 使用WebSocket协议完成来单提醒及客户催单功能

WebSocket介绍

WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信(双向传输)——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接, 并进行双向数据传输。

HTTP协议和WebSocket协议对比:

  • HTTP是短连接
  • WebSocket是长连接
  • HTTP通信是单向的,基于请求响应模式
  • WebSocket支持双向通信
  • HTTP和WebSocket底层都是TCP连接

 

思考:既然WebSocket支持双向通信,功能看似比HTTP强大,那么我们是不是可以基于WebSocket开发所有的业务功能?

WebSocket缺点:

服务器长期维护长连接需要一定的成本 各个浏览器支持程度不一 WebSocket 是长连接,受网络限制比较大,需要处理好重连

结论:WebSocket并不能完全取代HTTP,它只适合在特定的场景下使用

WebSocket应用场景:

1). 视频弹幕

2). 网页聊天  (最典型)

3). 体育实况更新 

 

来单提醒

需求分析和设计

用户下单并且支付成功后,需要第一时间通知外卖商家。通知的形式有如下两种:

  • 语音播报 
  • 弹出提示框

 

设计思路:

  • 通过WebSocket实现管理端浏览器和服务端保持长连接状态
  • 当客户支付后,调用WebSocket的相关API实现服务端向管理端浏览器推送消息
  • 管理端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语音播报
  • 约定服务端发送给管理端浏览器的数据格式为JSON,字段包括:type,orderId,content
    • type 为消息类型,1为来单提醒 2为客户催单
    • orderId 为订单id
    • content 为消息内容

 代码开发 

在OrderServiceImpl中注入WebSocketServer对象,修改paySuccess方法,加入如下代码: 

 当商家管理端浏览器接收到这个消息, 就是前端代码负责的了

客户催单

需求分析和设计 

用户在小程序中点击催单按钮后,需要第一时间通知外卖商家。通知的形式有如下两种:

  • 语音播报 
  • 弹出提示框

 

设计思路:

  • 通过WebSocket实现管理端页面和服务端保持长连接状态
  • 当用户点击催单按钮后,调用WebSocket的相关API实现服务端向管理端推送消息
  • 管理端浏览器解析服务端推送的消息,判断是来单提醒还是客户催单,进行相应的消息提示和语音播报
  • 约定服务端发送给管理端浏览器的数据格式为JSON,字段包括:type,orderId,content
    • type 为消息类型,1为来单提醒 2为客户催单
    • orderId 为订单id
    • content 为消息内容

当用户点击催单按钮时,向服务端发送请求。

代码开发

Controller层

根据用户催单的接口定义,在user/OrderController中创建催单方法:

 

Service层实现类

在OrderServiceImpl中实现reminder方法:

Mapper层

在OrderMapper中添加getById:

 

演示

用户进行催单

用户可在订单列表或者订单详情,进行催单

 

查看催单提醒

<think>嗯,用户想了解苍穹外卖项目中第10天关于WebSocket的实现教程或细节。我需要先回顾提供的三个引用内容,看看里面有没有相关的信息。 引用[1]提到课程内容包括Spring Task、订状态定时处理、WebSocket的来提醒客户。这说明第10天的课程确实涉及WebSocket的应用。引用[2]和[3]都提到了在OrderServiceImpl中注入WebSocketServer对象,并在支付成功后发送提醒。看来用户需要的是具体的实现步骤,比如如何配置WebSocket、服务端和客户端的代码,以及业务逻辑的处理。 用户的问题可能包括如何建立WebSocket,服务端如何收和处理消息,以及如何在前端展示提醒。需要分步骤解释,可能需要包括代码示例,如配置类、服务端端点、消息发送的时机等。同时,要注意引用中的代码片段,比如在paySuccess方法中加入发送消息的代码,这部分需要详细说明。 另外,用户可能还想知道WebSocket在订提醒客户中的具体应用场景,以及可能的优化方法。比如,如何确保消息的可靠传递,或者如何处理大量并发连。不过根据引用内容,可能主要聚焦在基础实现上,所以先回答核心实现步骤,再生成相关问题。</think>### 苍穹外卖项目Day10 WebSocket实现详解 根据引用内容,苍穹外卖项目第10天通过WebSocket实现了**来提醒**和**客户**功能,以下是具体实现步骤与逻辑: --- ### 一、WebSocket核心实现步骤 #### 1. **WebSocket服务端配置** ```java @ServerEndpoint("/websocket/{sid}") @Component public class WebSocketServer { // 存储会话对象和商户ID的映射 private static ConcurrentHashMap<String, Session> sessionMap = new ConcurrentHashMap<>(); @OnOpen public void onOpen(Session session, @PathParam("sid") String sid) { sessionMap.put(sid, session); // 商户连时绑定会话 } @OnMessage public void onMessage(String message) { // 处理客户端发送的消息 } @OnClose public void onClose(@PathParam("sid") String sid) { sessionMap.remove(sid); // 断开连时移除会话 } } ``` [^3] #### 2. **订支付成功后触发提醒** 在支付成功逻辑中注入WebSocket服务,向指定商户推送消息: ```java // OrderServiceImpl.java @Autowired private WebSocketServer webSocketServer; public void paySuccess(String orderId) { // 更新订状态... // 通过WebSocket推送新订提醒 webSocketServer.sendToAllClient("新订:" + orderId + " 已支付"); } ``` [^2] #### 3. **前端收消息(示例)** ```javascript let socket = new WebSocket('ws://localhost:8080/websocket/商户ID'); socket.onmessage = function(event) { alert('系统提醒:' + event.data); // 弹窗显示或新订 }; ``` --- ### 二、关键业务场景实现 #### 1. **来提醒流程 $$流程图:商户端WebSocket \rightarrow 支付成功触发推送 \rightarrow 前端弹窗/声音提醒$$ [^1] #### 2. **客户处理** 客户发起时,系统通过WebSocket实时通知对应商户: ```java // 在服务方法中 webSocketServer.sendToClient(商户ID, "订" + orderId + "客户"); ``` --- ### 三、技术要点总结 | 技术点 | 实现方式 | 引用来源 | |--------------|-----------------------------------|------------| | 连绑定 | 商户ID与会话映射存储 | | | 消息广播 | `sendToAllClient()`方法遍历会话 | | | 状态同步 | 支付成功后立即触发WebSocket推送 | | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值