|
|
|
@ -1,16 +1,15 @@
|
|
|
|
|
package com.supervision.controller;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
|
|
import javax.websocket.OnClose;
|
|
|
|
|
import javax.websocket.OnError;
|
|
|
|
|
import javax.websocket.OnOpen;
|
|
|
|
|
import javax.websocket.Session;
|
|
|
|
|
import javax.websocket.*;
|
|
|
|
|
import javax.websocket.server.PathParam;
|
|
|
|
|
import javax.websocket.server.ServerEndpoint;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.concurrent.CopyOnWriteArraySet;
|
|
|
|
|
import java.security.Principal;
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
|
|
|
|
@Component
|
|
|
|
@ -22,14 +21,14 @@ public class WebSocketServer {
|
|
|
|
|
private static final AtomicInteger onlineNum = new AtomicInteger(0);
|
|
|
|
|
|
|
|
|
|
//concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
|
|
|
|
|
private static final CopyOnWriteArraySet<Session> SESSION_POOL = new CopyOnWriteArraySet<Session>();
|
|
|
|
|
private static final ConcurrentHashMap<String, Session> SESSION_POOL = new ConcurrentHashMap<>();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 有客户端连接成功
|
|
|
|
|
*/
|
|
|
|
|
@OnOpen
|
|
|
|
|
public void onOpen(Session session, @PathParam(value = "uid") String uid) {
|
|
|
|
|
SESSION_POOL.add(session);
|
|
|
|
|
SESSION_POOL.put(uid, session);
|
|
|
|
|
onlineNum.incrementAndGet();
|
|
|
|
|
log.info(uid + "加入webSocket!当前人数为" + onlineNum);
|
|
|
|
|
}
|
|
|
|
@ -38,8 +37,8 @@ public class WebSocketServer {
|
|
|
|
|
* 连接关闭调用的方法
|
|
|
|
|
*/
|
|
|
|
|
@OnClose
|
|
|
|
|
public void onClose(Session session) {
|
|
|
|
|
SESSION_POOL.remove(session);
|
|
|
|
|
public void onClose(Session session, @PathParam(value = "uid") String uid) {
|
|
|
|
|
SESSION_POOL.remove(uid);
|
|
|
|
|
int cnt = onlineNum.decrementAndGet();
|
|
|
|
|
log.info("有连接关闭,当前连接数为:{}", cnt);
|
|
|
|
|
}
|
|
|
|
@ -59,7 +58,7 @@ public class WebSocketServer {
|
|
|
|
|
* 群发消息
|
|
|
|
|
*/
|
|
|
|
|
public void broadCastInfo(String message) throws IOException {
|
|
|
|
|
for (Session session : SESSION_POOL) {
|
|
|
|
|
for (Session session : SESSION_POOL.values()) {
|
|
|
|
|
if (session.isOpen()) {
|
|
|
|
|
sendMessage(session, message);
|
|
|
|
|
}
|
|
|
|
@ -76,7 +75,11 @@ public class WebSocketServer {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 实现一个方法用于踢下线用户
|
|
|
|
|
public void kickUser(String userId) {
|
|
|
|
|
SESSION_POOL.removeIf(session -> session.getUserPrincipal().getName().equals(userId));
|
|
|
|
|
public void kickUser(String userId) throws IOException {
|
|
|
|
|
log.info("踢用户{}下线", userId);
|
|
|
|
|
Session session = SESSION_POOL.get(userId);
|
|
|
|
|
if (ObjectUtil.isNotEmpty(session)) {
|
|
|
|
|
session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "用户被踢下线"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|