什么是WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
SpringBoot项目如何接入
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- 创建WebSocket服务类
@Slf4j
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {
/**
* concurrent包的线程安全map,用来存放每个客户端对应的MyWebSocket对象。
*/
private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
@OnOpen
public void onOpen(Session session) {
log.info("有新连接加入:{}", session.hashCode());
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
webSocketMap.remove(session.hashCode() + "");
log.info("有一连接关闭:{}", session.hashCode());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info("来自客户端的消息:" + message);
try {
JSONObject json = new JSONObject(message);
} catch (Exception e) {
log.error("服务端处理客户端消息失败:{}", e);
}
}
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误", error);
}
/**
* 服务端发送消息给客户端
*/
private void sendMessage(String message) {
try {
log.info("服务端给客户端[{}]发送消息{}", this.session.hashCode(), message);
this.session.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端发送消息给客户端失败:{}", e);
}
}
/**
* 群发自定义消息
*/
public static void sendInfo(String message) {
for (String key : webSocketMap.keySet()) {
webSocketMap.get(key).sendMessage(message);
}
}
/**
* 自定义消息
*/
public static void sendInfo(String code, String message) {
WebSocketServer webSocketServer = webSocketMap.get(code);
if (webSocketServer != null) {
webSocketServer.sendMessage(message);
}
}
/**
* 自定义消息
*/
public static void sendInfo(List<String> code, String message) {
for (String c : code) {
WebSocketServer webSocketServer = webSocketMap.get(c);
if (webSocketServer != null) {
webSocketServer.sendMessage(message);
}
}
}
- 创建配置类
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
- 进行测试
// 发送消息
WebSocketServer.sendInfo(1+"",param.toString());