package com.moon.server.service.all; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; /** * WebSocket服务类 * @author WWW */ @ServerEndpoint(value = "/ws/select") @Component public class WebSocketService { @PostConstruct public void init() { System.out.println("websocket 加载"); } private final static Logger log = LoggerFactory.getLogger(WebSocketService.class); private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0); /** * 用来存放每个客户端对应的Session对象(线程安全Set) */ private final static CopyOnWriteArraySet SESSION_SET = new CopyOnWriteArraySet(); /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session) { SESSION_SET.add(session); int cnt = ONLINE_COUNT.incrementAndGet(); log.info("有连接加入,当前连接数为:{}", cnt); sendMessage(session, "连接成功"); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(Session session) { SESSION_SET.remove(session); int cnt = ONLINE_COUNT.decrementAndGet(); log.info("有连接关闭,当前连接数为:{}", cnt); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session) { log.info("来自客户端的消息:{}", message); sendMessage(session, "收到消息,消息内容:" + message); } /** * 出现错误 */ @OnError public void onError(Session session, Throwable error) { log.error("发生错误:{},Session ID: {}", error.getMessage(), session.getId()); } /** * 发送消息,实践表明,每次浏览器刷新,session会发生变化。 */ public static void sendMessage(Session session, String message) { try { // session.getAsyncRemote().sendText(message) synchronized (session){ session.getBasicRemote().sendText(message); } } catch (Exception ex) { log.error("发送消息出错:{}", ex.getMessage()); } } /** * 群发消息 */ public static void broadCastInfo(String message) throws IOException { for (Session session : SESSION_SET) { if (session.isOpen()) { sendMessage(session, message); } } } /** * 指定Session发送消息 */ public static void sendMessage(String message, String sessionId) throws IOException { Session session = null; for (Session s : SESSION_SET) { if (s.getId().equals(sessionId)) { session = s; break; } } if (session != null) { sendMessage(session, message); } else { log.info("没有找到你指定ID的会话:{}", sessionId); } } }