package com.thhy.screen.modules.biz.bigscreen.controller;
|
|
import com.alibaba.nacos.api.annotation.NacosInjected;
|
import com.alibaba.nacos.api.exception.NacosException;
|
import com.alibaba.nacos.api.naming.NamingService;
|
import com.alibaba.nacos.api.naming.pojo.Instance;
|
import com.thhy.general.config.GlobalConfig;
|
import com.thhy.general.config.SysUserInfo;
|
import com.thhy.general.utils.SpringContextUtils;
|
import com.thhy.general.utils.UUIDUtils;
|
import com.thhy.general.utils.UserInfoUtils;
|
import com.thhy.screen.config.NetUtils;
|
import org.redisson.api.RBucket;
|
import org.redisson.api.RedissonClient;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Component;
|
import javax.websocket.OnClose;
|
import javax.websocket.OnMessage;
|
import javax.websocket.OnOpen;
|
import javax.websocket.Session;
|
import javax.websocket.server.PathParam;
|
import javax.websocket.server.ServerEndpoint;
|
import java.io.ByteArrayOutputStream;
|
import java.io.IOException;
|
import java.io.ObjectOutputStream;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
import java.util.concurrent.TimeUnit;
|
|
@ServerEndpoint("/prolistenserver/{usertoken}")
|
@Component
|
public class ProListenSocketServer {
|
|
private RedissonClient redissonClient;
|
|
public RedissonClient getRedissonClient() {
|
return SpringContextUtils.getBean(RedissonClient.class);
|
}
|
|
private GlobalConfig globalConfig;
|
|
public GlobalConfig getGlobalConfig() {
|
return SpringContextUtils.getBean(GlobalConfig.class);
|
}
|
|
private Logger logger = LoggerFactory.getLogger("SocketServer");
|
|
/**
|
* 线程安全的无序的集合
|
*/
|
public static final CopyOnWriteArraySet<Session> SESSIONS = new CopyOnWriteArraySet<>();
|
|
|
@OnOpen
|
public void open(Session session, @PathParam("usertoken") String userToken){
|
RedissonClient redissonClient = getRedissonClient();
|
GlobalConfig globalConfig = getGlobalConfig();
|
SysUserInfo userInfo = UserInfoUtils.getInstance().getUserInfo(userToken);
|
logger.info(session.getId()+"连接成功");
|
SESSIONS.add(session);
|
String host = NetUtils.getIp();
|
RBucket<Map<String,Object>> rBucketSess = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:sessioninfo:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId());
|
Map<String,Object> map = new HashMap<>();
|
map.put("host",host);
|
rBucketSess.set(map,365,TimeUnit.DAYS);
|
RBucket<SysUserInfo> rBucket = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:token:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId());
|
rBucket.set(userInfo,365, TimeUnit.DAYS);
|
RBucket<String> companyRBucket = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:company:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId());
|
companyRBucket.set(userInfo.getCompanyId(),365,TimeUnit.DAYS);
|
logger.info(session.getId()+"连接信息保存成功");
|
}
|
|
/**
|
* 连接关闭
|
*
|
* @param session
|
*/
|
@OnClose
|
public void onClose(Session session) {
|
logger.info(session.getId()+"连接关闭");
|
RedissonClient redissonClient = getRedissonClient();
|
GlobalConfig globalConfig = getGlobalConfig();
|
SESSIONS.remove(session);
|
String host = NetUtils.getIp();
|
RBucket<Map<String,Object>> rBucketSess = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:sessioninfo:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId());
|
rBucketSess.delete();
|
RBucket<SysUserInfo> rBucket = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:token:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId());
|
rBucket.delete();
|
RBucket<String> companyRBucket = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:company:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId());
|
companyRBucket.delete();
|
logger.info(session.getId()+"连接信息清除成功");
|
}
|
|
/**
|
* 接收到消息
|
*
|
* @param text
|
*/
|
@OnMessage
|
public String onMsg(String text) throws IOException {
|
return "servet 发送:" + text;
|
}
|
|
|
}
|