目录结构

导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<script type="text/javascript" src="js/jquery-3.6.0.js"></script>
<script>
let webSocket;
$(
function () {
webSocket = new WebSocket('ws://localhost:8080/myWebSocket');
webSocket.onopen = function (event) {
console.log('webSocket已连接');
}
webSocket.onclose = function (event) {
console.log('webSocket已关闭连接');
};
webSocket.onmessage = function (event) {
console.log(event);
console.log('接收到消息:' + event.data);
};
let close = $("#close");
let send = $("#send");
close.click(function () {
webSocket.close();
});
send.click(function () {
webSocket.send('hello webSocket');
console.log('消息已发送');
});
}
);
</script>
</head>
<body>
<input id="close" type="button" value="关闭webSocket"> <br>
<input id="send" type="button" value="发送消息">
</body>
</html>
配置类
package com.hky.algorithm.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* webSocket配置类
*/
@Configuration
public class WebSocketConfig {
/**
* 用于检测有@ServerEndpoint注解的类
* 配置websocket需要
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
监听函数类
package com.hky.algorithm.webSocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
/**
* webSocket服务类,每次客户端连接的时候都会创建一个新的类。
* 注意:不是单例的
*/
@Component
@Slf4j
@ServerEndpoint("/myWebSocket") // 服务端点,地址是“/myWebSocket”
public class MyWebSocket {
private Session session;
/**
* 注解 @OnOpen 表示方法是一个监听连接成功的回调方法
*
* @param session webSocket 的session
* @param name 参数
*/
@OnOpen
public void onOpen(Session session, @PathParam("name") String name) {
this.session = session;
log.info("webSocket已连接,连接客户端为 ");
log.info("sessionID = " + session.getId());
log.info("name = " + name);
}
/**
* 注解 @OnClose 表示方法是一个监听连接关闭的回调方法
*/
@OnClose
public void onClose() {
log.info("连接关闭");
}
/**
* 注解 @OnMessage 表示方法是一个监听接收到消息的回调方法
*/
@OnMessage
public void onMessage(String msg) {
log.info("接收消息 = " + msg + ",sessionId = " + session.getId() + ", this = " + this);
if ("hello webSocket".equals(msg)) {
sendMsg();
}
}
/**
* 注解 @OnError 表示方法是出现错误时的回调方法
*/
@OnError
public void onError(Session session, Throwable error) {
log.info("发生错误!sessionID = " + session.getId());
error.printStackTrace();
}
/**
* 发送消息
*/
public void sendMsg() {
try {
log.info("发送消息" + ",sessionId = " + session.getId());
session.getBasicRemote().sendText("hello browser");
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试

