From f65443d8abeaedc9d102324565e8368e7c9d90c8 Mon Sep 17 00:00:00 2001 From: 郑永安 <zyazyz250@sina.com> Date: 星期一, 19 六月 2023 14:41:54 +0800 Subject: [PATCH] commit --- src/main/java/com/gk/firework/Config/WebSocket/WebSocketServer.java | 123 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 123 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/gk/firework/Config/WebSocket/WebSocketServer.java b/src/main/java/com/gk/firework/Config/WebSocket/WebSocketServer.java new file mode 100644 index 0000000..2e863f2 --- /dev/null +++ b/src/main/java/com/gk/firework/Config/WebSocket/WebSocketServer.java @@ -0,0 +1,123 @@ +package com.gk.firework.Config.WebSocket; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.atomic.AtomicInteger; + +@Component("websocket") +@ServerEndpoint("/push/{uid}") +@Slf4j +public class WebSocketServer { + + @PostConstruct + public void init() { + System.out.println("websocket 加载"); + } + + //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 + private static final AtomicInteger onlineCount = new AtomicInteger(0); + //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 + private static Map<Long,WebSocketServer> webSocketMap = new ConcurrentHashMap<>(); + + //与某个客户端的连接会话,需要通过它来给客户端发送数据 + private Session session; + + private Long uid; + + + + + /** + * 连接建立成功调用的方法 + */ + @OnOpen + public void onOpen(Session session,@PathParam("uid") Long uid) { + this.session = session; + this.uid = uid; + if(webSocketMap.containsKey(uid)){ + webSocketMap.remove(uid); + webSocketMap.put(uid,this); + }else{ + webSocketMap.put(uid,this); + onlineCount.incrementAndGet(); + } + log.info("有新窗口开始监听:当前在线人数为" + onlineCount); + } + + /** + * 连接关闭调用的方法 + */ + @OnClose + public void onClose() { + if (webSocketMap.containsKey(uid)) { + webSocketMap.remove(uid); + onlineCount.decrementAndGet(); + } + log.info("有一连接关闭!当前在线人数为" + onlineCount); + } + + + + + /** + * 收到客户端消息后调用的方法 + * @param message 客户端发送过来的消息 + */ + @OnMessage + public void onMessage(String message) throws IOException { + log.info("来自客户端的消息:{}",message); + sendMessage("收到消息,消息内容:"+message); + } + + @OnError + public void onError(Session session, Throwable error) { + log.error("发生错误:{},Session ID: {}",error.getMessage(),session.getId()); + } + + public void sendMessage(String message) throws IOException { + synchronized(session) { + this.session.getBasicRemote().sendText(message); + } + } + + + /** + * @param uid + * @param message + */ + public static void sendMessage(@PathParam("uid") Long uid, String message) { + try { + if (webSocketMap.containsKey(uid)) webSocketMap.get(uid).sendMessage(message); + } catch (IOException e) { + log.error("发送消息出错:{}", e.getMessage()); + e.printStackTrace(); + } + } + + /** + * 群发消息 + * @param message + * @throws IOException + */ + public static void broadcast(String message) throws IOException { + + } + + + public Session getSession() { + return session; + } + + public void setSession(Session session) { + this.session = session; + } +} -- Gitblit v1.9.2