1 WebSocket 介绍
WebSocket 是一种在 Web 应用程序中实现实时、双向通信的协议。它允许客户端和服务器之间建立持久连接,以便它们可以在连接已建立后随时发送数据。与传统的 HTTP 请求-响应模型不同,WebSocket 允许服务器主动向客户端推送数据,而无需客户端先发出请求。
Websocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信一一浏览器和服务器只需要完成次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
以下是 WebSocket 的主要特点和优点:
-
双向通信:WebSocket 允许客户端和服务器之间进行双向通信,即使连接已建立,它们仍可以随时发送消息。
-
实时性:WebSocket 提供了低延迟的实时通信能力,适用于需要及时更新和响应的应用场景,如在线聊天、实时数据更新等。
-
持久连接:与传统的 HTTP 请求-响应模型不同,WebSocket 的连接是持久的,一旦建立连接,它将保持打开状态,直到客户端或服务器显式关闭连接。
-
减少网络流量:由于 WebSocket 的连接是持久的,不需要为每个请求创建新的连接,因此可以减少网络流量和服务器负载。
-
跨域支持:与 CORS(跨域资源共享)机制不同,WebSocket 不受同源策略的限制,允许跨域通信,因此非常适合构建跨域实时通信应用程序。
-
可扩展性:WebSocket 提供了灵活的 API 和协议,可以轻松地与现有的 Web 技术和框架集成,并支持自定义扩展。
WebSocket 协议是通过 HTTP/HTTPS 端口进行通信的,并且它的握手过程与 HTTP 1.1 兼容,因此它可以穿过大多数防火墙和代理服务器。在现代 Web 应用程序中,WebSocket 已经成为实时通信的重要组成部分,被广泛用于在线游戏、即时通讯、实时数据更新等场景。
2 需求分析
3 写代码
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
HashMap map = new HashMap();
map.put("type", 1);
map.put("orderId", ordersDB.getId());
map.put("content", "订单号: "+ outTradeNo);
String json = JSON.toJSONString(map);
webSocketServer.sendToAllClient(json);
}
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();
}
}
}
}