(1)在已经创建好的SpringBoot项目应用WebSocket依赖
pom.xml
<!-- websocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
(2)创建配置项WebSocketConfig.java
package wz.com.ai_diagnosis.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
/**
* @Author lxw
* @ClassName WebSocketConfig
* @Date 2025/6/16 14:57
*/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/diagnosis-websocket").setAllowedOriginPatterns("*").withSockJS();
}
}
(3)创建websocket业务层
service/WebSocketService.java
package wz.com.ai_diagnosis.service;
import wz.com.ai_diagnosis.entity.BDiagnosisResult;
import wz.com.ai_diagnosis.entity.VO.ObjectReturnVO;
import java.util.List;
/**
* @Author lxw
* @ClassName WebSocketService
* @Date 2025/6/16 14:59
*/
public interface WebSocketService {
void sendDiagnosisResults(String module, List<BDiagnosisResult> results);
void sendConsumpDiagResults(ObjectReturnVO objectReturnVO);
}
service/impl/WebSocketServiceImpl.java
package wz.com.ai_diagnosis.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;
import wz.com.ai_diagnosis.entity.VO.ObjectReturnVO;
import wz.com.ai_diagnosis.service.WebSocketService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author lxw
* @ClassName WebSocketServiceImpl
* @Date 2025/6/16 14:59
*/
@Slf4j
@Service
public class WebSocketServiceImpl implements WebSocketService {
@Autowired
private SimpMessagingTemplate messagingTemplate;
@Override
public void sendConsumpDiagResults(ObjectReturnVO objectReturnVO) {
Map<String, Object> message = new HashMap<>();
message.put("data", ResultUtil.success(objectReturnVO));
messagingTemplate.convertAndSend("/topic/diagConsump", message);
}
}
实体类entity/ObjectReturnVO.java
package wz.com.ai_diagnosis.entity.VO;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 自定义对象封装
* @Author lxw
* @ClassName ObjectVO
* @Date 2025/7/4 16:48
*/
@Data
@Accessors(chain = true)
public class ObjectReturnVO {
/**
* 结果数据
*/
private String resultData;
}
在自己的业务层中应用webSocketservice
@Autowired
WebSocketService webSocketService;
public test(){
webSocketService.sendConsumpDiagResults(new ObjectReturnVO().setResultData("无能耗诊断结果"));
}
页面测试
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>诊断模块实时结果查看</title>
<script src="https://cdn.jsdelivr.net/npm/sockjs-client@1/dist/sockjs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/stompjs@2.3.3/lib/stomp.min.js"></script>
<style>
body {
font-family: "Segoe UI", sans-serif;
padding: 20px;
}
h2 {
color: #2c3e50;
}
.result {
margin-bottom: 10px;
border: 1px solid #ddd;
border-left: 5px solid #3498db;
padding: 10px;
background-color: #f9f9f9;
}
.module-name {
font-weight: bold;
color: #2980b9;
}
.data {
margin-top: 5px;
color: #333;
}
/*方式二使用*/
.diagnosis-panel {
border: 1px solid #ccc;
margin-bottom: 12px;
border-radius: 5px;
padding: 8px;
background-color: #fff;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
}
summary {
font-weight: bold;
font-size: 16px;
cursor: pointer;
color: #2980b9;
}
summary span {
font-size: 14px;
color: #666;
}
.diagnosis-panel pre {
max-height: 300px;
overflow: auto;
white-space: pre-wrap; /* 保留换行符同时允许长行自动换行 */
word-wrap: break-word;
}
</style>
</head>
<body>
<h2>诊断模块实时结果</h2>
<div id="results"></div>
<script>
const socket = new SockJS('http://192.168.0.18:5100/diagnosis-websocket');
const stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
console.log('WebSocket connected:', frame);
stompClient.subscribe('/topic/diagnosis', function (message) {
const payload = JSON.parse(message.body);
const moduleName = payload.module;
const data = payload.data;
console.log('result:', data);
});
});
</script>
</body>
</html>