10 changed files with 203 additions and 101 deletions
-
41src/main/java/com/iflytop/handacid/app/websocket/server/MyWebSocketHandler.java
-
24src/main/java/com/iflytop/handacid/app/websocket/server/WebSocketConfig.java
-
17src/main/java/com/iflytop/handacid/app/websocket/server/WebSocketConnectedEvent.java
-
27src/main/java/com/iflytop/handacid/app/websocket/server/WebSocketEventListener.java
-
25src/main/java/com/iflytop/handacid/app/websocket/server/WebSocketSender.java
-
51src/main/java/com/iflytop/handacid/app/websocket/server/WebSocketServer.java
-
14src/main/java/com/iflytop/handacid/app/websocket/server/WebSocketServerConfig.java
-
63src/main/java/com/iflytop/handacid/app/websocket/server/WebSocketSessionManager.java
-
2src/main/java/com/iflytop/handacid/app/websocket/server/WebsocketMsg.java
@ -0,0 +1,41 @@ |
|||||
|
package com.iflytop.handacid.app.websocket.server; |
||||
|
|
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.context.ApplicationEventPublisher; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.web.socket.TextMessage; |
||||
|
import org.springframework.web.socket.WebSocketSession; |
||||
|
import org.springframework.web.socket.handler.TextWebSocketHandler; |
||||
|
|
||||
|
@Slf4j |
||||
|
@Component |
||||
|
public class MyWebSocketHandler extends TextWebSocketHandler { |
||||
|
|
||||
|
private final WebSocketSessionManager sessionManager; |
||||
|
private final ApplicationEventPublisher eventPublisher; |
||||
|
|
||||
|
public MyWebSocketHandler(WebSocketSessionManager sessionManager, ApplicationEventPublisher eventPublisher) { |
||||
|
this.sessionManager = sessionManager; |
||||
|
this.eventPublisher = eventPublisher; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void afterConnectionEstablished(WebSocketSession session) throws Exception { |
||||
|
sessionManager.add(session); |
||||
|
eventPublisher.publishEvent(new WebSocketConnectedEvent(this, session)); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void afterConnectionClosed(WebSocketSession session, org.springframework.web.socket.CloseStatus status) throws Exception { |
||||
|
// 从管理器移除 |
||||
|
sessionManager.remove(session); |
||||
|
super.afterConnectionClosed(session, status); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { |
||||
|
// 如果需要,也可以在这里处理消息 |
||||
|
log.info("收到消息,sessionId={},内容={}", session.getId(), message.getPayload()); |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
package com.iflytop.handacid.app.websocket.server; |
||||
|
|
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.web.socket.config.annotation.EnableWebSocket; |
||||
|
import org.springframework.web.socket.config.annotation.WebSocketConfigurer; |
||||
|
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; |
||||
|
|
||||
|
@Configuration |
||||
|
@EnableWebSocket |
||||
|
public class WebSocketConfig implements WebSocketConfigurer { |
||||
|
|
||||
|
private final MyWebSocketHandler myWebSocketHandler; |
||||
|
|
||||
|
public WebSocketConfig(MyWebSocketHandler myWebSocketHandler) { |
||||
|
this.myWebSocketHandler = myWebSocketHandler; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { |
||||
|
registry.addHandler(myWebSocketHandler, "/ws") |
||||
|
.setAllowedOrigins("*") // 根据需要限制 |
||||
|
.addInterceptors(new org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor()); |
||||
|
} |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
package com.iflytop.handacid.app.websocket.server; |
||||
|
|
||||
|
|
||||
|
import lombok.Getter; |
||||
|
import org.springframework.context.ApplicationEvent; |
||||
|
import org.springframework.web.socket.WebSocketSession; |
||||
|
|
||||
|
@Getter |
||||
|
public class WebSocketConnectedEvent extends ApplicationEvent { |
||||
|
private final WebSocketSession session; |
||||
|
|
||||
|
public WebSocketConnectedEvent(Object source, WebSocketSession session) { |
||||
|
super(source); |
||||
|
this.session = session; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
package com.iflytop.handacid.app.websocket.server; |
||||
|
|
||||
|
import com.iflytop.handacid.app.core.state.DeviceState; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.context.event.EventListener; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.web.socket.TextMessage; |
||||
|
import org.springframework.web.socket.WebSocketSession; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
|
||||
|
@Slf4j |
||||
|
@Component |
||||
|
@RequiredArgsConstructor |
||||
|
public class WebSocketEventListener { |
||||
|
private final WebSocketSender webSocketSender; |
||||
|
private final DeviceState deviceState; |
||||
|
|
||||
|
@EventListener |
||||
|
public void handleWebSocketConnected(WebSocketConnectedEvent event) throws IOException { |
||||
|
WebSocketSession session = event.getSession(); |
||||
|
log.info("监听到新的 WS 连接,sessionId={}", session.getId()); |
||||
|
session.sendMessage(new TextMessage("链接成功")); |
||||
|
webSocketSender.push(WebSocketMessageType.STATUS, deviceState.toJSON()); |
||||
|
} |
||||
|
} |
@ -1,51 +0,0 @@ |
|||||
package com.iflytop.handacid.app.websocket.server; |
|
||||
|
|
||||
import jakarta.websocket.*; |
|
||||
import jakarta.websocket.server.ServerEndpoint; |
|
||||
import lombok.extern.slf4j.Slf4j; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
import java.util.Collections; |
|
||||
import java.util.HashSet; |
|
||||
import java.util.Set; |
|
||||
|
|
||||
@Slf4j |
|
||||
@ServerEndpoint("/ws") |
|
||||
@Component |
|
||||
public class WebSocketServer { |
|
||||
private static final Set<Session> sessions = Collections.synchronizedSet(new HashSet<>()); |
|
||||
|
|
||||
public static void sendMessageToClients(String message) { |
|
||||
synchronized (sessions) { |
|
||||
for (Session session : sessions) { |
|
||||
try { |
|
||||
session.getBasicRemote().sendText(message); |
|
||||
} catch (Exception e) { |
|
||||
log.error("WS发送给客户端失败 sessionId={}", session.getId(), e); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
@OnOpen |
|
||||
public void onOpen(Session session) { |
|
||||
sessions.add(session); |
|
||||
log.info("新连接加入,sessionId={}", session.getId()); |
|
||||
} |
|
||||
|
|
||||
@OnMessage |
|
||||
public void onMessage(String message, Session session) { |
|
||||
log.info("收到消息 sessionId={},内容:{}", session.getId(), message); |
|
||||
} |
|
||||
|
|
||||
@OnClose |
|
||||
public void onClose(Session session) { |
|
||||
sessions.remove(session); |
|
||||
log.info("连接已关闭,sessionId={}", session.getId()); |
|
||||
} |
|
||||
|
|
||||
@OnError |
|
||||
public void onError(Session session, Throwable error) { |
|
||||
log.error("发生错误,sessionId={}", session.getId(), error); |
|
||||
} |
|
||||
} |
|
@ -1,14 +0,0 @@ |
|||||
package com.iflytop.handacid.app.websocket.server; |
|
||||
|
|
||||
import org.springframework.context.annotation.Bean; |
|
||||
import org.springframework.context.annotation.Configuration; |
|
||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter; |
|
||||
|
|
||||
@Configuration |
|
||||
public class WebSocketServerConfig { |
|
||||
|
|
||||
@Bean |
|
||||
public ServerEndpointExporter serverEndpointExporter() { |
|
||||
return new ServerEndpointExporter(); |
|
||||
} |
|
||||
} |
|
@ -0,0 +1,63 @@ |
|||||
|
package com.iflytop.handacid.app.websocket.server; |
||||
|
|
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.web.socket.TextMessage; |
||||
|
import org.springframework.web.socket.WebSocketSession; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
import java.util.Collections; |
||||
|
import java.util.HashSet; |
||||
|
import java.util.Set; |
||||
|
|
||||
|
/** |
||||
|
* 统一管理所有 WebSocketSession |
||||
|
*/ |
||||
|
@Component |
||||
|
public class WebSocketSessionManager { |
||||
|
|
||||
|
private final Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>()); |
||||
|
|
||||
|
/** |
||||
|
* 连接建立时调用 |
||||
|
*/ |
||||
|
public void add(WebSocketSession session) { |
||||
|
sessions.add(session); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 连接关闭时调用 |
||||
|
*/ |
||||
|
public void remove(WebSocketSession session) { |
||||
|
sessions.remove(session); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 广播所有在线客户端 |
||||
|
*/ |
||||
|
public void broadcast(String payload) { |
||||
|
synchronized (sessions) { |
||||
|
for (WebSocketSession session : sessions) { |
||||
|
if (session.isOpen()) { |
||||
|
try { |
||||
|
session.sendMessage(new TextMessage(payload)); |
||||
|
} catch (IOException e) { |
||||
|
// log 或者移除无效 session |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 定向给某个 session 发消息 |
||||
|
*/ |
||||
|
public void sendTo(WebSocketSession session, String payload) { |
||||
|
if (session.isOpen()) { |
||||
|
try { |
||||
|
session.sendMessage(new TextMessage(payload)); |
||||
|
} catch (IOException e) { |
||||
|
// log |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue