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 asyncio

app = 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>

配置 WebSocket

import 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 {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new OrderStatusHandler(), "/ws").setAllowedOrigins("*");
    }
}
WebSocket Handler

import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.web.socket.TextMessage;

public class OrderStatusHandler extends TextWebSocketHandler {

    @Override
    public 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 main

import (
	"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 路径与后端路由匹配。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量&#xff1f;什么是数据类型&#xff1f;2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …

面试题:Kafka(一)

1. Kafka如何保证消息不丢失 生产者发送消息到Brocker丢失 设置异步发送 消息重试 消息在Brocker中存储丢失 发送确认机制acks 消费者从Brocker接收消息丢失 Kafka 中的分区机制指的是将每个主题划分成多个分区&#xff08;Partition&#xff09;topic分区中消息只能由消费者…

[Redis#1] 前言 | 再谈服务端高并发分布式结构的演进

目录 电子商务应用架构演进 概述 常见概念 架构演进 总结 总结 应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09; 模块&#xff08;Module&#xff09;/ 组件&#xff08;Component&#xff09; 分布式&#xff08;Distributed&#xff0…

洛谷刷题日记||基础篇9(线性表)

代码思路&#xff1a; 初始化圈&#xff1a;利用 std::list 保存编号为 1 到 n 的人。循环报数&#xff1a;利用迭代器模拟报数的过程&#xff0c;每次数到 m 时将对应的人出圈。循环处理&#xff1a;std::list::erase 删除出圈的人&#xff0c;并返回下一个人的迭代器&#x…

Elasticsearch开启认证及kibana密码登陆

Elasticsearch不允许root用户运行,使用root用户为其创建一个用户es,为用户es配置密码,并切换到es用户。 adduser elastic passwd elastic su elasticElasticsearch(简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful web…

ESLint的简单使用(js,ts,vue)

一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范&#xff08;命名&#xff0c;格式等&#xff09; 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法&#xff0c;而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…

学习threejs,使用AnimationMixer实现变形动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.AnimationMixer 动画…

嵌入式驱动开发详解1(系统调用)

文章目录 符设备驱动架构read函数详解用户层read函数内核层read函数 具体实现用户层代码 内核层代码细节分析 符设备驱动架构 如上图所示&#xff0c;应用层程序直接用系统提供的API函数即可调用驱动层相应的函数&#xff0c;中间的具体过程都是由linux内核实现的&#xff0c;…

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头 本节设置的意义 主要就是为了复习图论算法, 尝试从题目解析的角度,更深入的理解图论算法… 并查集篇 并查集简介以…

解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题

解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 Chapter1 解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 Chapter1 解决Ubuntu18.04及以上版本高分辨率下导致字体过小问题 目前使用的是三星4K显示屏&#xff0c;屏幕分辨率太高了&#xff0c;导致VMWare Workst…

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考&#xff1a; https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…

Mac的Terminal随机主题配置

2024年8月8日 引言 对于使用Mac的朋友&#xff0c;如果你是一个程序员&#xff0c;那肯定会用到Terminal。一般来说Terminal就是一个黑框&#xff0c;但其实Terminal是有10款官方皮肤。 每个都是不一样的主题&#xff0c;颜色和字体都会有所改变。现在就有一个方法可以很平均…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时&#xff0c;获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法&#xff0c;您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

ReactPress vs VuePress vs RectPress

ReactPress&#xff1a;重塑内容管理的未来 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。ReactPress作为一款融合了现代Web开发多项先进技术的开源发布平台&#xff0c;正以其卓越的性能、灵活性和可扩展性&…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息&#xff0c;对森林图斑进行精确区划。相较于传统手段&#xff0c;无人机调查具有低成本、高效率、高时效的特点&#xff0c;尤其在地理环境条件不好的区域&#xff0c;调查人员无法或难以到达的…

RTC纽扣电池寿命问题分析

一、 问题描述 一款带RTC功能的终端产品&#xff0c;RTC使用寿命设计要求高于5年&#xff0c;产品研发后测试&#xff0c;发现VDD_BATT的电流大于100uA&#xff0c;导致产品实际计算出来寿命只有半年之久&#xff0c;下图是RTC电路图&#xff1a; 图1 RTC供电电路 二、 原因分…

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…

ElasticSearch学习笔记三:基础操作(一)

一、前言 上一篇文章中&#xff0c;我们学习了如何使用Java客户端去连接并且简单的操作ES&#xff0c;今天我们将对ES中的基本操作进行学习&#xff0c;包括索引操作、映射操作、文档操作。 二、索引操作 简单回顾一下索引&#xff0c;ES中的索引就有相同结构的数据的集合&a…

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词英文模板&#x1f4af;提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征&#xff0c;代表着产品达到了高标准的要求。从技术层面看&#xff0c;认证确保产品与华为鲲鹏架构深度融合&#xff0c;能充分释放鲲鹏芯片的高性能、低功耗优势&#xff0c;为集成平台的高效运行提供强大动力。在安全方面&#xff0c;…