You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
virtual-patient/virtual-patient-web/src/main/java/com/supervision/controller/WebSocketServer.java

83 lines
2.4 KiB
Java

package com.supervision.controller;
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.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;
@Component
@Slf4j
@ServerEndpoint("/webSocket/{uid}")
public class WebSocketServer {
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static final AtomicInteger onlineNum = new AtomicInteger(0);
//concurrent包的线程安全Set用来存放每个客户端对应的WebSocketServer对象。
private static final CopyOnWriteArraySet<Session> SESSION_POOL = new CopyOnWriteArraySet<Session>();
/**
*
*/
@OnOpen
public void onOpen(Session session, @PathParam(value = "uid") String uid) {
SESSION_POOL.add(session);
onlineNum.incrementAndGet();
log.info(uid + "加入webSocket当前人数为" + onlineNum);
}
/**
*
*/
@OnClose
public void onClose(Session session) {
SESSION_POOL.remove(session);
int cnt = onlineNum.decrementAndGet();
log.info("有连接关闭,当前连接数为:{}", cnt);
}
/**
*
*/
public void sendMessage(Session session, String message) throws IOException {
if (session != null) {
synchronized (session) {
session.getBasicRemote().sendText(message);
}
}
}
/**
*
*/
public void broadCastInfo(String message) throws IOException {
for (Session session : SESSION_POOL) {
if (session.isOpen()) {
sendMessage(session, message);
}
}
}
/**
*
*/
@OnError
public void onError(Session session, Throwable throwable) {
log.error("发生错误");
throwable.printStackTrace();
}
// 实现一个方法用于踢下线用户
public void kickUser(String userId) {
SESSION_POOL.removeIf(session -> session.getUserPrincipal().getName().equals(userId));
}
}