对比新文件 |
| | |
| | | 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; |
| | | } |
| | | } |