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 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> rBucketSess = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:sessioninfo:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId()); Map map = new HashMap<>(); map.put("host",host); rBucketSess.set(map,365,TimeUnit.DAYS); RBucket rBucket = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:token:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId()); rBucket.set(userInfo,365, TimeUnit.DAYS); RBucket 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> rBucketSess = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:sessioninfo:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId()); rBucketSess.delete(); RBucket rBucket = redissonClient.getBucket(globalConfig.getKeyPrefix()+":ws:token:"+host+"-"+globalConfig.getServerPort()+"-"+session.getId()); rBucket.delete(); RBucket 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; } }