| | |
| | | |
| | | import javax.websocket.*; |
| | | import javax.websocket.server.PathParam; |
| | | import javax.websocket.server.ServerEndpoint; |
| | | import java.io.IOException; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | |
| | | |
| | | /** |
| | | * @author hjl |
| | | */ |
| | | @ServerEndpoint(value = "/websocket/{workerId}") |
| | | //@ServerEndpoint(value = "/websocket/{workerId}") |
| | | @Component |
| | | public class WebSocketServer { |
| | | |
| | |
| | | /** |
| | | * 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 |
| | | */ |
| | | private static int onlineCount = 0; |
| | | private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0); |
| | | |
| | | /** |
| | | * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象 |
| | |
| | | */ |
| | | @OnOpen |
| | | public void onOpen(Session session, @PathParam("workerId") String workerId) { |
| | | this.session = session; |
| | | this.userId = workerId; |
| | | if (WEB_SOCKET_MAP.containsKey(workerId)) { |
| | | WEB_SOCKET_MAP.remove(workerId); |
| | | WEB_SOCKET_MAP.put(workerId, new WebSocketClient(session, workerId)); |
| | | //加入set中 |
| | | if (null != workerId && !"".equals(workerId.trim())) { |
| | | this.session = session; |
| | | this.userId = workerId; |
| | | if (WEB_SOCKET_MAP.containsKey(workerId)) { |
| | | WEB_SOCKET_MAP.remove(workerId); |
| | | WEB_SOCKET_MAP.put(workerId, new WebSocketClient(session, workerId)); |
| | | //加入set中 |
| | | } else { |
| | | WEB_SOCKET_MAP.put(workerId, new WebSocketClient(session, workerId)); |
| | | //加入set中 |
| | | addOnlineCount(); |
| | | } |
| | | log.info("用户 " + workerId + " 已连接: 当前在线人数为:" + getOnlineCount()); |
| | | try { |
| | | sendMessage("socket连接成功!"); |
| | | } catch (IOException e) { |
| | | log.error("用户:" + workerId + ",网络异常!!!!!!"); |
| | | } |
| | | } else { |
| | | WEB_SOCKET_MAP.put(workerId, new WebSocketClient(session, workerId)); |
| | | //加入set中 |
| | | addOnlineCount(); |
| | | } |
| | | log.info("用户 " + workerId + " 已连接: 当前在线人数为:" + getOnlineCount()); |
| | | try { |
| | | sendMessage("socket连接成功!"); |
| | | } catch (IOException e) { |
| | | log.error("用户:" + workerId + ",网络异常!!!!!!"); |
| | | log.info("用户 " + workerId + " 已连接: 当前在线人数为:" + getOnlineCount()); |
| | | try { |
| | | sendMessage("socket连接失败!"); |
| | | } catch (IOException e) { |
| | | log.error("用户:" + workerId + ",网络异常!!!!!!"); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | //从set中删除 |
| | | subOnlineCount(); |
| | | } |
| | | log.info("用户退出:" + userId + ",当前在线人数为:" + getOnlineCount()); |
| | | log.info("用户退出: " + userId + ",当前在线人数为: " + getOnlineCount()); |
| | | } |
| | | |
| | | /** |
| | |
| | | @OnError |
| | | public void onError(Session session, Throwable error) { |
| | | log.error("用户错误:" + this.userId + ",原因:" + error.getMessage()); |
| | | if (WEB_SOCKET_MAP.containsKey(userId)) { |
| | | WEB_SOCKET_MAP.remove(userId); |
| | | //从set中删除 |
| | | subOnlineCount(); |
| | | } |
| | | error.printStackTrace(); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | public static synchronized int getOnlineCount() { |
| | | return onlineCount; |
| | | return ONLINE_COUNT.get(); |
| | | } |
| | | |
| | | public static synchronized void addOnlineCount() { |
| | | WebSocketServer.onlineCount++; |
| | | ONLINE_COUNT.incrementAndGet(); |
| | | } |
| | | |
| | | public static synchronized void subOnlineCount() { |
| | | WebSocketServer.onlineCount--; |
| | | ONLINE_COUNT.decrementAndGet(); |
| | | } |
| | | } |