WebSocket双向通信详解及实战应用
创作时间:
作者:
@小白创作中心
WebSocket双向通信详解及实战应用
引用
CSDN
1.
https://blog.csdn.net/m0_74963840/article/details/140407723
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器与客户端之间进行实时、双向的数据传输。本文将详细介绍WebSocket的基础概念、使用方法,并通过一个外卖催单和来单提醒的实际应用场景,帮助读者深入理解WebSocket技术。
WebSocket基础使用
WebSocket小说明:
作用
浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
WebSocket与HTTP最大的区别
- HTTP通信是单向的,基于请求响应模式
- WebSocket支持双向通信。实现长连接
适用场景:
消息通信,视频弹幕,实时信息,等双向通信的使用需求
使用:
引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
使用一个封装好的使用工具类:
package com.sky.websocket;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* WebSocket服务
*/
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {
//存放会话对象
private static Map<String, Session> sessionMap = new HashMap();
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid) {
System.out.println("客户端:" + sid + "建立连接");
sessionMap.put(sid, session);
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, @PathParam("sid") String sid) {
System.out.println("收到来自客户端:" + sid + "的信息:" + message);
}
/**
* 连接关闭调用的方法
*
* @param sid
*/
@OnClose
public void onClose(@PathParam("sid") String sid) {
System.out.println("连接断开:" + sid);
sessionMap.remove(sid);
}
/**
* 群发
*
* @param message
*/
public void sendToAllClient(String message) {
Collection<Session> sessions = sessionMap.values();
for (Session session : sessions) {
try {
//服务器向客户端发送消息
session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
小案例:实现客户端与服务器的双向通信
package com.sky.task;
import com.sky.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component
public class WebSocketTask {
@Autowired
private WebSocketServer webSocketServer;
/**
* 通过WebSocket每隔5秒向客户端发送消息
*/
@Scheduled(cron = "0/5 * * * * ?")
public void sendMessageToClient() {
webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
}
}
实际使用:苍穹外卖客户催单,与来单提醒
第一步:服务端与客户端建立连接
第二步:在需要推送消息的类方法上。创建号消息对象后调用封装好的WebSocketServer即可推送
来单提醒:将提醒信息转换成json格式的数据后就可直接调用WebSocketServer完成向浏览器客户端推送消息
/**
* 支付成功,修改订单状态
*
* @param outTradeNo
*/
public void paySuccess(String outTradeNo) {
// 根据订单号查询订单
Orders ordersDB = orderMapper.getByNumber(outTradeNo);
// 根据订单id更新订单的状态、支付方式、支付状态、结账时间
Orders orders = Orders.builder()
.id(ordersDB.getId())
.status(Orders.TO_BE_CONFIRMED)
.payStatus(Orders.PAID)
.checkoutTime(LocalDateTime.now())
.build();
orderMapper.update(orders);
//通过websocket向客户端浏览器推送消息type orderId content
Map map=new HashMap<>();
map.put("type",1);
map.put("orderId",ordersDB.getId());
map.put("content,订单号",outTradeNo);
String json=JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);
}
客户催单:将催单信息转换成json格式的数据后就可直接调用WebSocketServer完成向浏览器客户端推送消息
/**
* 客户催单
* @param id
*/
@Override
public void reminder(Long id) {
// 根据id查询订单
Orders ordersDB = orderMapper.getById(id);
// 校验订单是否存在
if (ordersDB == null) {
throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
}
Map map=new HashMap<>();
map.put("type",2);
map.put("order",id);
map.put("content","订单号:" + ordersDB.getNumber());
//通过webSocket向客户端浏览器推送消息
webSocketServer.sendToAllClient(JSON.toJSONString(map));
}
效果:在用户下单或者催单后商家服务端就会出现提醒
热门推荐
陈允斌改良版,核桃皮壳煮鸡蛋的养生真相
青少年近视防控:科学认知与有效方法
百合花的健康益处你知道多少?
罗斯福新政:炉边谈话背后的经济奇迹
2024年必读心理学新书:破解手机依赖、内耗等现代人精神困境
金花茶栽培指南:世界级濒危物种的科学保护与种植技术
香蒜酱:健康蘸料的新宠儿
什么是GPS导航系统?什么是北斗导航系统?他们主要的区别是什么?
猫咪饮食大揭秘:避开这些坑!
反渗透净水器废水之困:成因剖析与节水对策
从缓存清理到升级手机:4个步骤解决APP内存占用问题
千岛湖鱼头汤:一碗传承百年的冬日暖心美味
双色球中奖秘籍:数学算法大揭秘
东方市打卡最美自然景观攻略
高圆圆复古风:经典单品+巧搭技巧,轻松复制
INFP如何用同理心建立深厚友谊?
坡子街&永定美食七街:长沙必打卡的两大特色美食街
冬季养生首选:新疆鹰嘴豆的营养与烹饪全攻略
压力管理,让你告别痘痘和色斑
张国焘路线错误致西路军兵败,敌强我弱雪上加霜
豆瓣酱炒麻辣豆腐,秒变大厨!
低卡高纤,蒸土豆成秋季养生优选
蔼儿舒:宝宝牛奶过敏的营养守护者
智能能量管理+双擎驱动,沃尔沃引领插电混动技术新趋势
-25℃仍能稳定运行,低温空气源热泵热风机完胜普通空调
维生素C美白全攻略:原理、使用方法及产品推荐
当黄帝遇上八仙:《原神》钟离角色设计的文化溯源
龙腾虎跃迎甲辰:中国龙文化古今传承与国际传播
二手车试驾指南:三大维度全面评估车辆性能
湖塘村:萍乡的420年古村落,藏着独特建筑与红色记忆