1.pom.xml添加WebSocke依赖
<!-- SpringBoot Websocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.添加WebSocke配置类
@Configuration
public class WebSocketConfig {
/**
* 这个bean的注册,用于扫描带有@ServerEndpoint的注解成为websocket ,如果你使用外置的tomcat就
不需要该配置文件
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3.添加WebSocke服务类
/**
*该类相当于Controller控制层的功能 单例模式
* 这个两个注解分别
*/
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocket {
private static Logger log = LoggerFactory.getLogger(WebSocket.class);
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<WebSocket>();
/**
* 客户端创建连接时触发
*/
@OnOpen
public void onOpen(Session session) {
System.out.println("session.getId()>>>>>>>>>" + session.getId());
webSocketSet.add(this); //加入set中
log.info("当前在线人数为" + webSocketSet.size());
try {
onMessage("连接成功",session);
} catch (Exception e) {
log.error("websocket IO异常");
}
}
/**
* 客户端连接关闭时触发
*/
@OnClose
public void onClose(Session session) {
try {
webSocketSet.remove(this); //从set中删除
session.close();
log.info("有一连接关闭!当前在线人数为" + webSocketSet.size());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 收到客户端消息时触发
* 有三种消息类型:String类型,ByteBuffer类型,PongMessage类型,同一消息类型类里不能出现多次
* @param message 客户端发送过来的消息
*/
@OnMessage
public static void onMessage(String message, Session session) throws IOException {
log.info("服务器消息推送:"+message);
session.getBasicRemote().sendText(message);
log.info("收到的信息:" + session, message);
}
/**
* 连接发生故障时候触发
*
* @param error 错误信息
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}
/**************************************************拓展方法**********************************************************/
/**
* @desc: 服务器推送消息
* @author: Ice.Wang
* @date: 2023/11/28
* @param message 要发送的消息
* @return:
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
log.info("输出推送内容:" + message);
}
/**
* @desc: 自定义消息
* @author: Ice.Wang
* @date: 2023/12/1
* @param noticeType 消息类型
* @param message 消息体
* @return:
*/
public static void sendInfoResp(String noticeType,String message) throws IOException {
log.info("推送内容:" + message);
NoticeWebsocketResp noticeWebsocketResp = new NoticeWebsocketResp();
noticeWebsocketResp.setNoticeType(noticeType);
noticeWebsocketResp.setNoticeInfo(message);
sendMessageResp(noticeWebsocketResp);
}
/**
* @desc: 接受消息静态方法
* @author: Ice.Wang
* @date: 2023/12/1
* @param noticeWebsocketResp 接受实体类
* @return:
*/
public static void sendMessageResp(NoticeWebsocketResp noticeWebsocketResp) throws IOException {
String message = JSONObject.toJSONString(noticeWebsocketResp);
for (WebSocket item : webSocketSet) {
try {
//推送
item.sendMessage(message);
} catch (IOException e) {
continue;
}
}
log.info("输出推送内容:" + message);
}
4. 返回前端的实体类
/**
* @program: ws通知返回对象
* @description:
* @author: Ice.Wang
* @create: 2023-12-01
**/
@Data
public class NoticeWebsocketResp {
/**
* 通知类型
*/
private String noticeType;
/**
* 通知内容
*/
private String noticeInfo;
}
5. 如何去调用发送消息
例如:
// 返回前端集合
List<Object> resultList = new ArrayList<>();
// 初始化ObjectMapper对象
ObjectMapper objectMapper = new ObjectMapper();
// 调用writeValueAsString()方法将List转换为JSON字符串
String jsonStr = objectMapper.writeValueAsString(resultList);
webSocket.sendInfoResp("类型",jsonStr);
参考地址🔗