@ServerEndpoint("/websocket/{userId}")
@Component
public class WebSocketServer {
private Logger logger = LoggerFactory.getLogger(WebSocketServer.class);
//concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象。
private static ConcurrentHashMap<Long, WebSocketServer> webSocketSet = new ConcurrentHashMap<>();
// 會話
private Session session;
// 用戶id
private Long userId;
// 收到請求後調用的方法
@OnMessage
public void handleMessage(Session session, String message) {
logger.info("收到客戶端的請求");
}
// 連接建立成功調用的方法
@OnOpen
public void onOpen(Session session, @PathParam("userId")Long userId){
logger.info("建立webSocket的連接");
this.session = session;
this.userId = userId;
webSocketSet.put(userId, this);
}
// 連接關閉調用的方法
@OnClose
public void onClose() {
logger.info("關閉socket連接");
webSocketSet.remove(userId);
}
// 發生錯誤調用的方法
@OnError
public void onError(Session session, Throwable err) {
logger.info("發生錯誤");
err.printStackTrace();
}
// 服務器主動發消息, 給指定的用戶發消息
public void sendMessage(String message, Long userId) {
try {
if(webSocketSet.get(userId) != null) {
webSocketSet.get(userId).sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
}