文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。

WebSocket是客户端和服务器端的一个通信,WebSocket分为客户端和服务端,所以我们两个端都要开发,前端的WebSocket在卖家订单管理界面的js代码里,会进行一个监听,一旦微信点餐的前端对服务端产生一个新的订单,服务端WebSocket就会对含有WebSocket的前端卖家订单管理界面发送消息,收到消息的前端就可以进行一系列的动作,如弹出提醒框、播放音乐等。

后端的开发

第一步 要引入SpringBoot对WebSocket的依赖

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

第二步

@Component
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

第三步 在订单业务类的的创建订单方法完成后,后端向前端商家管理系统的订单界面发送WebSocket消息。

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {@Autowiredprivate ProductService productService;@Autowiredprivate OrderDetailRepository orderDetailRepository;@Autowiredprivate WebSocket webSocket;@Override@Transactionalpublic OrderDTO create(OrderDTO orderDTO) {String orderId= KeyUtil.genUniqueKey();BigDecimal orderAmount=new BigDecimal(BigInteger.ZERO);
//        List<CartDTO> cartDTOList=new ArrayList<>();//1.查询商品(数量,价格)for(OrderDetail orderDetail:orderDTO.getOrderDetailList()){ProductInfo productInfo=productService.findOne(orderDetail.getProductId());if(productInfo==null){
//                throw new SellException(ResultEnum.PRODUCT_NOT_EXIT);throw new ResponseBankException();}//2.计算订单总价orderAmount=productInfo.getProductPrice().multiply(new BigDecimal(orderDetail.getProductQuantity())).add(orderAmount);//订单详情入库orderDetail.setDetailId(KeyUtil.genUniqueKey());orderDetail.setOrderId(orderId);BeanUtils.copyProperties(productInfo,orderDetail);orderDetailRepository.save(orderDetail);//            CartDTO cartDTO=new CartDTO(orderDetail.getProductId(),orderDetail.getProductQuantity());
//            cartDTOList.add(cartDTO);}//3,写入订单数据库(orderMaster和orderDetail)OrderMaster orderMaster=new OrderMaster();orderDTO.setOrderId(orderId);BeanUtils.copyProperties(orderDTO,orderMaster);
//        orderMaster.setOrderId(orderId);orderMaster.setOrderAmount(orderAmount);orderMaster.setOrderStatus(OrderStatusEnum.NEW.getCode());orderMaster.setPayStatus(PayStatusEnum.WAIT.getCode());orderMasterRepository.save(orderMaster);//4.扣库存List<CartDTO> cartDTOList=orderDTO.getOrderDetailList().stream().map(e->new CartDTO(e.getProductId(),e.getProductQuantity())).collect(Collectors.toList());productService.decreaseStock(cartDTOList);//发送websocket消息(重点)webSocket.sendMessage(orderDTO.getOrderId());return orderDTO;}

这样我们后端WebSocket相关的业务逻辑类已全部完成。

第四步 写一个响应前端WebSocket的后端WebSocket,这也是一个Controller,但比较特殊,是用WS协议进行通信的,我们写在Service包里。

@Component
@ServerEndpoint("/webSocket")
@Slf4j
public class WebSocket {private Session session;private static CopyOnWriteArraySet<WebSocket> webSocketSet=new CopyOnWriteArraySet<>();@OnOpenpublic void onOpen(Session session){this.session=session;webSocketSet.add(this);log.info("【websocket消息】 有新的连接,总数:{}",webSocketSet.size());}@OnClosepublic void onClose(){webSocketSet.remove(this);log.info("【websocket消息】 连接断开,总数:{}",webSocketSet.size());}@OnMessagepublic void onMessage(String message){log.info("【websocket消息】 收到客户端发来的消息:{}",message);}public void sendMessage(String message){for(WebSocket webSocket:webSocketSet){log.info("【websocket消息】 广播消息,message={}",message);try {webSocket.session.getBasicRemote().sendText(message);}catch (Exception e){e.printStackTrace();}}}}

前端开发

前端卖家商品管理前端界面的WebSocket如下:

<script>var websocket=null;if('WebSocket' in window){websocket=new WebSocket('ws://sqmax.natapp1.cc/sell/webSocket');}else{alert('该浏览器不支持websocket');}websocket.onopen=function (ev) {console.log('建立连接');}websocket.onclose=function (ev) {console.log('连接关闭');}websocket.onmessage=function (ev) {console.log('收到消息:'+ev.data);//弹窗提醒,播放消息$('#myModal').modal('show');document.getElementById('notice').play();}window.onbeforeunload=function (ev) {websocket.close();}
</script>

以下是WebSocket js代码控制HTML。

<div class="modal fade" id="myModal" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h4 class="modal-title" id="myModalLabel">提醒</h4></div><div class="modal-body">你有新的订单</div><div class="modal-footer"><button onclick="javascript:document.getElementById('notice').pause()" type="button" class="btn btn-default" data-dismiss="modal">关闭</button><button onclick="location.reload()" type="button" class="btn btn-primary">查看新的订单</button></div></div></div>
</div>
<#--播放音乐-->
<audio id="notice" loop="loop"><source src="/sell/mp3/song.mp3" type="audio/mpeg" />
</audio>

当前端收到后端的WebSocket消息后,会弹出一个对话框,并播放音乐。

最后我们来测试一下代码。

我们用Postman这个工具代替前端微信点餐,向指定url发送一个如下的post请求。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYvSqyU8-1626146041349)(https://raw.githubusercontent.com/sqmax/springboot-project/blog/pic/12.PNG)]
在前端的商家管理界面可以看到如下的效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlenmDZg-1626146041351)(https://raw.githubusercontent.com/sqmax/springboot-project/blog/pic/11.PNG)]

出处:https://github.com/sqmax/springboot-project/wiki/WebSocket%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81

java使用websocket前后端通信实现相关推荐

  1. 如何使用websocket实现前后端通信

    如何使用websocket实现前后端通信 websocket通信是很好玩的,也很有用的的通信方式,使用方式如下: 第一步由于springboot很好地集成了websocket,所以先在在pom.xml ...

  2. 【websocket前后端交互】vue-springboot实现websocket前后端交互链接,websocket心跳重连,包含前后端代码,复制即可用【详细解释版本】

    前言: 还是老规矩,一步步的教大家如何建立前后端的 websocket 链接,并能完成互相传送数据的简单功能.由于网上找了半天发现很多帖子都是东一句西一句的,要不就是写的没什么注释和解释,导致我这个前 ...

  3. java计算机毕业设计前后端分离健身房管理系统源代码+数据库+系统+lw文档

    java计算机毕业设计前后端分离健身房管理系统源代码+数据库+系统+lw文档 java计算机毕业设计前后端分离健身房管理系统源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语 ...

  4. java+vue实现前后端导出html的word文档

    java+vue实现前后端导出html的word文档 该内容主要是完成项目中实战导出word文档,而且不需要其他的依赖,原生的写法即可! 本项目架构: PS:不是这个架构的话看下逻辑就好,赶紧找别的博 ...

  5. 05-ET框架的前后端通信1

    TIPS: 本系列贴仅用于博主学习ET框架的记录 文章目录 前言 一.ET框架的前后端如何进行通信的? 二.前后端的通信使用 1.编写protobuf消息体 2.编写C#代码 3.运行结果 总结 前言 ...

  6. java和Vue前后端RSA对称加密

    java和Vue前后端RSA对称加密 参考:https://blog.csdn.net/qq_25623257/article/details/109775531 一.生成秘钥对(公私钥) 在线生成地 ...

  7. 06-ET框架的前后端通信2

    TIPS: 本系列贴仅用于博主学习ET框架的记录 文章目录 前言 一.IMessage是什么? 二.使用步骤 1.编写proto消息体 2.编写C#代码 3.运行结果 总结 前言 这篇文章记录ET框架 ...

  8. WebSocket前后端联调

    WebSocket前后端联调 问题简介  最近由于要进行态势推演的开发,该功能需要实现多个websocket的管理,因此,在进行开发时,学习了关于前后端联调的一些细节,记录一下.该文章主要描述如何高效 ...

  9. JAVA中的前后端交互

    JDBC 什么是JDBC java数据库连接(Java Database Connectivity) 有什么用 利用 Java 代码, 可以操作数据库. 怎么用 注册驱动 获取数据库连接 创建 Sta ...

最新文章

  1. 【设计模式】软件设计七大原则 ( 接口隔离原则 | 代码示例 )
  2. linux u盘内容乱码,Linux挂载U盘,中文显示为乱码
  3. c++ properties_Java怎么从这四个位置读取配置文件Properties(普通文件系统-classpath-jar-URL)
  4. CentOS7 LVM磁盘扩容
  5. kali Linux 火狐浏览器改中文
  6. Djang重新整理migrations,解决:Django Table xxx already exist
  7. linux中权限765啥意思,Linux中的文件权限
  8. 重磅!AI大牛邢波出任AI大学校长,李开复姚期智都是校董
  9. python3 抽象基类 abc.abstractmethod
  10. 51单片机学习历程(二)快速入门51单片机
  11. 人工神经网络心得体会_人工智能学习心得
  12. 电脑连不上网络,报红叉,网络适配器报黄色警告,错误代码56,解决办法
  13. UCanCode发布跨平台开源组态\ 建模\仿真\工控VX++ 2021
  14. 安卓利用谷歌文字转语音引擎实现离线文字播报语音
  15. Even-Odd Increments
  16. php去掉二维数组中某key的值
  17. 用到的Android studio依赖库
  18. 计算机数值分析-插值法-差商-04
  19. SSH介绍与神器Tabby
  20. Microsoft Excel 中 ROMAN 函数介绍

热门文章

  1. 应用程序“DEFAULT WEB SITE/ICLOCK”中的服务器错误
  2. 基于STM32的SPI基本介绍
  3. kmalloc/kfree,vmalloc/vfree函数用法和区别
  4. 波卡链Substrate (6)Babe协议二“分配slot机制”
  5. 区块链BaaS云服务(16)天德链TDBC“交易数据”
  6. 简单点名小程序(伪)----android开发
  7. 近世代数--整环上的唯一分解问题--唯一分解整环上有算术分解定理
  8. 面向对象程序设计(Java)
  9. 02-Armv8-A Instruction Set Architecture
  10. [HOW TO]-下载android官方源码