若依框架整合WebSocket
一、前端
1、定义socket对象
data(){
return{
webSocket: null,
}
}
2、建立连接
if (!this.webSocket) {
this.webSocket = new WebSocket(`ws://localhost:8081/handleData/`);
this.webSocket.onopen = function(event) {
console.log('WebSocket connected');
};
this.webSocket.onmessage = (event) => {
console.log(event)
};
this.webSocket.onerror = function(event) {
console.error('WebSocket error:', event);
this.webSocket = null;
};
this.webSocket.onclose = function(event) {
console.log('WebSocket connection closed');
this.webSocket = null;
};
}
3、向服务端发送消息
if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {
const msg = {
}
this.webSocket.send(JSON.stringify(msg));
}
二、后端
1、webSocket配置
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
2、webSocket服务建立
@Slf4j
@Component
@ServerEndpoint("/handleData")
@CrossOrigin
public class WebSocketServer {
private static Logger logger = LoggerFactory.getLogger(WebSocketServer.class);
private static AtomicInteger onlineCount = new AtomicInteger(0);
private static CopyOnWriteArrayList<Session> sessionList=new CopyOnWriteArrayList<>();
private static DataService dataService;
@Autowired
public void setDeviceDataService(DataService dataService) {
WebSocketServer.dataService = dataService;
}
@OnOpen
public void onOpen(Session session) {
String path = session.getRequestURI().getPath();
onlineCount.incrementAndGet();
sessionList.add(session);
logger.info("socket连接加入:----deviceId: {},type: {},当前在线人数为:{}----", deviceId, type, onlineCount.get());
MessageDto messageDto = new MessageDto();
sessionMap.put(session,new SendDataDto(session,messageDto));
sendMessage(JSONObject.toJSONString(data), session);
}
@OnClose
public void onClose(Session session) {
Iterator<Session> iterator = sessionList.iterator();
while(iterator.hasNext()){
Session next = iterator.next();
if(session==next){
sessionList.remove(session);
sessionMap.remove(session);
onlineCount.decrementAndGet();
logger.info("连接{}关闭",session);
}
}
}
@OnError
public void onError(Session session, Throwable error) {
logger.error("系统发生错误");
sessionList.remove(session);
sessionMap.remove(session);
error.printStackTrace();
}
@OnMessage
public void onMessage(String message, Session session) {
logger.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);
MessageDto messageDto = JSONObject.parseObject(message, MessageDto.class);
for (Map.Entry<Session, SendDataDto> entry : sessionMap.entrySet()) {
if (entry.getKey() == session) {
MessageDto dto = entry.getValue().getMessageDto();
break;
}
}
sendMessage(JSONObject.toJSONString(data), session);
}
public static synchronized void sendMessage(String message, Session toSession) {
try {
logger.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
logger.error("服务端发送消息给客户端失败:{}",e.getMessage());
}
}
}
3、处理socket消息业务类
@Component
public class DataService {
public static final Logger logger = LoggerFactory.getLogger(DataService.class);
public static ConcurrentHashMap<Session, Object> sessionMap = new ConcurrentHashMap<>();
@PostConstruct
public void getAllDevicesList(){
}
@Scheduled(fixedRate = 10000)
public void fetchDataAndSendToFrontend() {
for (Map.Entry<Session, Object> entry : sessionMap.entrySet()) {
logger.info("--------------------------------------------------------------------------------");
Object value = entry.getValue();
logger.info("--------------------------------------------------------------------------------");
}
}
public void getRealTimeData(){
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2023-06-05 Autowired注解与Resource注解的区别