|
@@ -0,0 +1,55 @@
|
|
|
|
|
+package nju.seec.helper.controller.websocket;
|
|
|
|
|
+
|
|
|
|
|
+import lombok.EqualsAndHashCode;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
+
|
|
|
|
|
+import javax.websocket.OnClose;
|
|
|
|
|
+import javax.websocket.OnError;
|
|
|
|
|
+import javax.websocket.OnOpen;
|
|
|
|
|
+import javax.websocket.Session;
|
|
|
|
|
+import javax.websocket.server.PathParam;
|
|
|
|
|
+import javax.websocket.server.ServerEndpoint;
|
|
|
|
|
+import java.util.Collections;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+import java.util.Set;
|
|
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
+import java.util.concurrent.CopyOnWriteArraySet;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author cst
|
|
|
|
|
+ */
|
|
|
|
|
+@ServerEndpoint("/api/websocket/comment/slide/{slideId}")
|
|
|
|
|
+@RestController
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+@EqualsAndHashCode
|
|
|
|
|
+public class CommentWebsocket {
|
|
|
|
|
+ private static Map<Integer, Set<CommentWebsocket>> COMMENT_WEBSOCKET_MAP = new ConcurrentHashMap<>();
|
|
|
|
|
+ private Integer slideId;
|
|
|
|
|
+ private Session session;
|
|
|
|
|
+
|
|
|
|
|
+ @OnOpen
|
|
|
|
|
+ public void onOpen(Session session, @PathParam("slideId") Integer slideId) {
|
|
|
|
|
+ this.session = session;
|
|
|
|
|
+ this.slideId = slideId;
|
|
|
|
|
+ if (COMMENT_WEBSOCKET_MAP.get(slideId) == null) {
|
|
|
|
|
+ COMMENT_WEBSOCKET_MAP.put(slideId, new CopyOnWriteArraySet<>());
|
|
|
|
|
+ }
|
|
|
|
|
+ COMMENT_WEBSOCKET_MAP.get(slideId).add(this);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @OnClose
|
|
|
|
|
+ public void onClose() {
|
|
|
|
|
+ COMMENT_WEBSOCKET_MAP.get(slideId).remove(this);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @OnError
|
|
|
|
|
+ public void onError(Throwable throwable) {
|
|
|
|
|
+ log.error(throwable.getLocalizedMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static void sendAllMessage(Integer slideId, String message) {
|
|
|
|
|
+ COMMENT_WEBSOCKET_MAP.getOrDefault(slideId, Collections.emptySet())
|
|
|
|
|
+ .forEach(commentWebsocket -> commentWebsocket.session.getAsyncRemote().sendText(message));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|