WebSocket实战,后台修改订单状态,前台实现数据变更,提供前端和后端多种语言

案例场景:

       在实际的后台中需要变更某个订单的状态,在官网中不刷新页面,可以自动更新状态

在前端页面实现订单状态的实时更新(不刷新页面),可以通过 WebSocket 的方式与后台保持通信,监听订单状态的变化并更新页面。以下是实现方式的详细说明:

  • 后端支持 WebSocket 服务: 后端需要支持 WebSocket,并在订单状态变更时推送消息到前端。

  • 前端实现 WebSocket 连接: 在官网前端页面通过 WebSocket 接收订单状态变更的通知。

方法 1:使用 WebSocket(推荐)   本次后端使用GO实现

 检查连接是否成功,可以在浏览器开发者工具中查看 WebSocket 连接状态。

    const socket = new WebSocket('ws://192.168.0.123:8080/ws')socket.onopen = () => {console.log('WebSocket connected')socket.send('Hello, server!')}socket.onmessage = event => {console.log('Message from server:', event.data)}socket.onclose = () => {console.log('WebSocket connection closed')}socket.onerror = error => {console.error('WebSocket error:', error)}
  // 建立 WebSocket 连接const socket = new WebSocket('ws://192.168.0.123:8080/ws')// 监听连接打开事件socket.addEventListener('open', () => {console.log('WebSocket connected')})// 接收服务器推送的消息socket.addEventListener('message', event => {const data = JSON.parse(event.data)if (data.orderId && data.status) {// 假设订单状态在页面中通过订单ID显示updateOrderStatus(data.orderId, data.status)}})// 更新订单状态的函数function updateOrderStatus (orderId, newStatus) {const orderElement = document.querySelector(`#gong`)if (orderElement) {orderElement.textContent = newStatus // 假设状态是文本console.log(`订单 ${orderId} 状态更新为: ${newStatus}`)}}

后端推送消息格式(示例):


{"orderId": "12345","status": "已完成"
}

后端多种语言

 1. Node.js 使用 ws   安装 WebSocket 库

 npm install ws

const WebSocket = require('ws');// 创建 WebSocket 服务
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', (ws) => {console.log('客户端已连接');// 接收消息ws.on('message', (message) => {console.log(`收到消息: ${message}`);});// 向客户端发送消息ws.send(JSON.stringify({ orderId: '12345', status: '已完成' }));// 模拟订单状态更新推送setInterval(() => {ws.send(JSON.stringify({ orderId: '12345', status: '已完成' }));}, 5000);
});console.log('WebSocket 服务已启动,监听端口 8080');

2、Python 使用 FastAPIwebsockets    安装依赖

pip install fastapi uvicorn websockets

from fastapi import FastAPI, WebSocket
import asyncioapp = FastAPI()@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()print("客户端已连接")# 模拟向客户端发送订单状态while True:await asyncio.sleep(5)await websocket.send_json({"orderId": "12345", "status": "已完成"})

启动服务

uvicorn main:app --reload --host 0.0.0.0 --port 8000

3、Java 使用 Spring Boot    添加依赖

pom.xml 中添加 Spring WebSocket 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

配置 WebSocketimport org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new OrderStatusHandler(), "/ws").setAllowedOrigins("*");}
}
WebSocket Handlerimport org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.web.socket.TextMessage;public class OrderStatusHandler extends TextWebSocketHandler {@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {System.out.println("客户端已连接");// 模拟订单状态推送new Thread(() -> {try {while (true) {session.sendMessage(new TextMessage("{\"orderId\": \"12345\", \"status\": \"已完成\"}"));Thread.sleep(5000);}} catch (Exception e) {e.printStackTrace();}}).start();}
}

3、Go 使用 gorilla/websocket    安装依赖

go get github.com/gorilla/websocket

package mainimport ("fmt""net/http""time""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true },
}func handler(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {fmt.Println("连接失败:", err)return}defer conn.Close()fmt.Println("客户端已连接")// 模拟订单状态推送for {time.Sleep(5 * time.Second)err = conn.WriteJSON(map[string]interface{}{"orderId": "12345","status":  "已完成",})if err != nil {fmt.Println("发送消息失败:", err)break}}
}func main() {http.HandleFunc("/ws", handler)fmt.Println("WebSocket 服务已启动,监听端口 8080")http.ListenAndServe(":8080", nil)
}

 最佳实践:

  • 在实际生产环境中,可以结合 消息队列(如 Kafka、RabbitMQ)处理大规模 WebSocket 消息推送。
  • 实现断线重连功能,确保客户端始终连接到服务端。

 1. 基本规则

WebSocket 使用 ws://wss:// 协议:

  • ws://:用于未加密的连接(通常在本地或不使用 HTTPS 的环境中使用)。
  • wss://:用于加密的连接(必须在 HTTPS 环境中使用)。
  • 地址的格式类似于 HTTP,但协议是 WebSocket,端口与后端配置保持一致:
  • ws://host:port/path
    wss://host:port/path
  • 确保 /ws 路径与后端路由匹配。

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

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

相关文章

Django5 2024全栈开发指南(二):Django项目配置详解

目录 一、基本配置信息二、资源文件配置2.1 资源路由——STATIC_URL2.2 资源集合——STATICFILES_DIRS2.3 资源部署——STATIC_ROOT2.2.4 媒体资源——MEDIA 三、模板配置四、数据库配置4.1 mysqlclient连接MySQL4.2 pymysql连接MySQL4.3 多个数据库的连接方式4.4 使用配置文件…

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统&#xff1f; 近几年的新笔记本默认开启了raid on模式或vmd选项&#xff0c;安装过程中会遇到问题&#xff0c;新笔记本电脑重装自带的系统建议采用u盘方式安装&#xff0c;默认新笔记本有bitlocker加密机制&#xff0c;如果采用一键重装系统或硬盘方式安装…

黑马智数Day10

项目背景说明 后台管理部分使用的技术栈是Vue2&#xff0c;前台可视化部分使用的技术栈是Vue3 前台可视化项目不是独立存在&#xff0c;而是和后台管理项目共享同一个登录页面 微前端的好处 微前端是一种前端架构模式&#xff0c;它将大型单体应用程序分解为小的、松散耦合的…

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果

prop校验,prop和data区别

prop:组件上注册的一些自定义属性 prop作用&#xff1a;向子组件传递数据 特点&#xff1a; 可以传递任意数量&#xff0c;任意类型的prop 父组件 &#xff08;一个个地传递比较麻烦&#xff0c;可以直接打包成一个对象传过去&#xff0c;然后通过点属性接收&#xff09; <t…

ubuntu显示管理器_显示导航栏

ubuntu文件管理器_显示导航栏 一、原始状态&#xff1a; 二、显示导航栏状态&#xff1a; 三、原始状态--->导航栏状态: 1、打开dconf编辑器&#xff0c;直接在搜索栏搜索 dconf-editor ------如果没有安装&#xff0c;直接按流程安装即可。 2、进入目录&#xff1a;org …

跨平台WPF框架Avalonia教程 一

安装 安装 Avalonia UI 模板​ 开始使用 Avalonia 的最佳方式是使用模板创建一个应用程序。 要安装 Avalonia 模板&#xff0c;请运行以下命令&#xff1a; dotnet new install Avalonia.Templates 备注 对于 .NET 6.0 及更早版本&#xff0c;请将 install 替换为 --inst…

UE5 材质里面画圆锯齿严重的问题

直接这么画圆会带来锯齿&#xff0c;我们对锯齿位置进行模糊 可以用smoothstep&#xff0c;做值的平滑过渡&#xff08;虽然不是模糊&#xff0c;但是类似&#xff09;

【MySql】实验十六 综合练习:图书管理系统数据库结构

文章目录 创建图书管理系统数据库结构一、创建数据表1.1 book表1.2 reader表1.3 borrow表 二、插入示例数据2.1 向book表插入数据2.2 向reader表插入数据2.3 向borrow表插入数据 三、查询操作3.1 根据语义为借书表borrow的bno列和 rno列建立外键3.2 查询张小海编写的“数据库原…

QT QLabel双击事件

新建类&#xff1a; DoubleClickLabel .h #pragma once#include <QLabel>class DoubleClickLabel : public QLabel {Q_OBJECTpublic:DoubleClickLabel(QWidget *parent);~DoubleClickLabel(); signals:void doubleClicked();protected: //这里重写双击事件virtual v…

Vue3中实现插槽使用

目录 一、前言 二、插槽类型 三、示例 四、插槽的分类实现 1. 基本插槽 2. 命名插槽 3. 默认插槽内容 4. 作用域插槽&#xff08;Scoped Slots&#xff09; 5. 多插槽与具名插槽组合 一、前言 在 Vue 3 中&#xff0c;插槽&#xff08;Slot&#xff09;用于实现组件的内…

【学习笔记】科学计算

[pytorch 加速] CPU传输 & GPU计算的并行&#xff08;pin_memory&#xff0c;non_blocking&#xff09; https://www.bilibili.com/video/BV15Xxve1EtZ from IPython.display import Image import os os.environ[http_proxy] http://127.0.0.1:7890 os.environ[https_pr…

2、计算机网络七层封包和解包的过程

计算机网络osi七层模型 1、网络模型总体预览2、数据链路层4、传输层5.应用层 1、网络模型总体预览 图片均来源B站&#xff1a;网络安全收藏家&#xff0c;没有本人作图 2、数据链路层 案例描述&#xff1a;主机A发出一条信息&#xff0c;到路由器A&#xff0c;这里封装目标MAC…

在云服务器搭建 Docker

操作场景 本文档介绍如何在腾讯云云服务器上搭建和使用 Docker。本文适用于熟悉 Linux 操作系统&#xff0c;刚开始使用腾讯云云服务器的开发者。如需了解更多关于 Docker 相关信息&#xff0c;请参见 Docker 官方。 说明&#xff1a; Windows Subsystem for Linux&#xff…

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…

【时间之外】IT人求职和创业应知【37】-AIGC私有化

目录 新闻一&#xff1a;2024智媒体50人成都会议暨每经20周年财经媒体峰会召开 新闻二&#xff1a;全球机器学习技术大会在北京召开 新闻三&#xff1a;区块链技术在金融领域的应用取得新突破 不知不觉的坚持了1个月&#xff0c;按照心理学概念&#xff0c;还要坚持2个月&am…

亿咖通科技应邀出席微软汽车行业智享会,分享ECARX AutoGPT全新实践

11月14日&#xff0c;全球出行科技企业亿咖通科技&#xff08;纳斯达克股票代码&#xff1a;ECX&#xff09;应邀于广州参加由微软举行的汽车行业智享会&#xff0c;揭晓了亿咖通科技对“AI定义汽车”时代的洞察与技术布局&#xff0c;分享了亿咖通科技汽车垂直领域大模型ECARX…

三维测量与建模笔记 - 点特征提取 - 4.3 Harris特征点

在3D重建应用中&#xff0c;很重要的一个场景是找到两幅图像中的同名特征点&#xff0c;这个过程需要对特征点进行提取和描述。 从上面描述可以看出&#xff0c;如果窗口处于颜色变化不明显或者没有变化的区域&#xff0c;E的值很小或为0&#xff1b;如果窗口处于边缘位置&…

C指针之舞——指针探秘之旅

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏内容&#xff1a;C语言学习专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 指针基础学习 在之前的博客文章中&#xff0c;简单总结了指针的基础概念 我们知道了指针的概念&#xf…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…