156 lines
4.5 KiB
Plaintext
156 lines
4.5 KiB
Plaintext
|
|
package com.sercurityControl.proteam.monitor.controller;
|
|||
|
|
|
|||
|
|
import com.alibaba.fastjson.JSONObject;
|
|||
|
|
import com.sercurityControl.proteam.monitor.domain.NoticeWebsocketResp;
|
|||
|
|
import lombok.extern.slf4j.Slf4j;
|
|||
|
|
import org.springframework.context.annotation.Scope;
|
|||
|
|
import org.springframework.stereotype.Component;
|
|||
|
|
import org.springframework.util.StringUtils;
|
|||
|
|
import javax.websocket.*;
|
|||
|
|
import javax.websocket.server.PathParam;
|
|||
|
|
import javax.websocket.server.ServerEndpoint;
|
|||
|
|
import java.io.IOException;
|
|||
|
|
import java.net.Socket;
|
|||
|
|
import java.util.*;
|
|||
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @author cw chen
|
|||
|
|
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
|
|||
|
|
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
|
|||
|
|
* @date 2023-04-28 14:57
|
|||
|
|
*/
|
|||
|
|
@ServerEndpoint("/websocket/{userId}")
|
|||
|
|
@Component
|
|||
|
|
@Slf4j
|
|||
|
|
@Scope("prototype")
|
|||
|
|
public class NoticeWebsocket {
|
|||
|
|
|
|||
|
|
//记录连接的客户端
|
|||
|
|
public static Map<String, Session> clients = new ConcurrentHashMap<>();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* userId关联sid(解决同一用户id,在多个web端连接的问题)
|
|||
|
|
*/
|
|||
|
|
public static Map<String, Set<String>> conns = new ConcurrentHashMap<>();
|
|||
|
|
|
|||
|
|
private String sid = null;
|
|||
|
|
|
|||
|
|
private String userId;
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 连接成功后调用的方法
|
|||
|
|
* @param session
|
|||
|
|
* @param userId
|
|||
|
|
*/
|
|||
|
|
@OnOpen
|
|||
|
|
public void onOpen(Session session, @PathParam("userId") String userId) {
|
|||
|
|
this.sid = UUID.randomUUID().toString();
|
|||
|
|
this.userId = userId;
|
|||
|
|
clients.put(this.sid, session);
|
|||
|
|
|
|||
|
|
Set<String> clientSet = conns.get(userId);
|
|||
|
|
if (clientSet==null){
|
|||
|
|
clientSet = new HashSet<>();
|
|||
|
|
conns.put(userId,clientSet);
|
|||
|
|
}
|
|||
|
|
clientSet.add(this.sid);
|
|||
|
|
log.info(this.sid + "连接开启!");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 连接关闭调用的方法
|
|||
|
|
*/
|
|||
|
|
@OnClose
|
|||
|
|
public void onClose() {
|
|||
|
|
log.info(this.sid + "连接断开!");
|
|||
|
|
clients.remove(this.sid);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 判断是否连接的方法
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
public static boolean isServerClose() {
|
|||
|
|
if (NoticeWebsocket.clients.values().size() == 0) {
|
|||
|
|
log.info("已断开");
|
|||
|
|
return true;
|
|||
|
|
}else {
|
|||
|
|
log.info("已连接");
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 发送给所有用户
|
|||
|
|
* @param noticeType
|
|||
|
|
*/
|
|||
|
|
public static void sendMessage(String noticeType){
|
|||
|
|
NoticeWebsocketResp noticeWebsocketResp = new NoticeWebsocketResp();
|
|||
|
|
noticeWebsocketResp.setNoticeType(noticeType);
|
|||
|
|
sendMessage(noticeWebsocketResp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 发送给所有用户
|
|||
|
|
* @param noticeWebsocketResp
|
|||
|
|
*/
|
|||
|
|
public static void sendMessage(NoticeWebsocketResp noticeWebsocketResp){
|
|||
|
|
String message = JSONObject.toJSONString(noticeWebsocketResp);
|
|||
|
|
for (Session session1 : NoticeWebsocket.clients.values()) {
|
|||
|
|
try {
|
|||
|
|
session1.getBasicRemote().sendText(message);
|
|||
|
|
} catch (IOException e) {
|
|||
|
|
e.printStackTrace();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 根据用户id发送给某一个用户
|
|||
|
|
* **/
|
|||
|
|
public static void sendMessageByUserId(String userId, NoticeWebsocketResp noticeWebsocketResp) {
|
|||
|
|
if (!StringUtils.isEmpty(userId)) {
|
|||
|
|
String message = JSONObject.toJSONString(noticeWebsocketResp);
|
|||
|
|
Set<String> clientSet = conns.get(userId);
|
|||
|
|
if (clientSet != null) {
|
|||
|
|
Iterator<String> iterator = clientSet.iterator();
|
|||
|
|
while (iterator.hasNext()) {
|
|||
|
|
String sid = iterator.next();
|
|||
|
|
Session session = clients.get(sid);
|
|||
|
|
if (session != null) {
|
|||
|
|
try {
|
|||
|
|
session.getBasicRemote().sendText(message);
|
|||
|
|
} catch (IOException e) {
|
|||
|
|
e.printStackTrace();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 收到客户端消息后调用的方法
|
|||
|
|
* @param message
|
|||
|
|
* @param session
|
|||
|
|
*/
|
|||
|
|
@OnMessage
|
|||
|
|
public void onMessage(String message, Session session) {
|
|||
|
|
log.info("收到来自窗口"+this.userId+"的信息:"+message);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 发生错误时的回调函数
|
|||
|
|
* @param error
|
|||
|
|
*/
|
|||
|
|
@OnError
|
|||
|
|
public void onError(Throwable error) {
|
|||
|
|
log.info("错误");
|
|||
|
|
error.printStackTrace();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|