package com.gk.hotwork.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.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 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; } }