import io.netty.channel.Channel;
import io.netty.util.AttributeKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author
* @version 1.0.0
* @description VerifyChannelAndToken
* @since 2022/2/14 9:44
*/
@Component
public class VerifyChannelAndTokenController2 {
public static final ConcurrentHashMap<String, Channel> serverChannelMap = new ConcurrentHashMap<>();
//通道与用户的绑定关系
public static final ConcurrentHashMap<Channel, String> serverChannelMapInversion = new ConcurrentHashMap<>();
/**
* 判断一个通道是否有用户在使用
* 可做信息转发时判断该通道是否合法
*
* @param channel
* @return
*/
public static boolean hasUser(Channel channel) {
AttributeKey<String> key = AttributeKey.valueOf("user");
//netty移除了这个map的remove方法,这里的判断谨慎一点
return (channel.hasAttr(key) || channel.attr(key).get() != null);
}
/**
* 上线一个用户
*
* @param channel
* @param userId
*/
public static void online(Channel channel, String userId) {
//先判断用户是否在web系统中登录?
//这部分代码个人实现
serverChannelMap.put(userId, channel);
serverChannelMapInversion.put(channel,userId);
AttributeKey<String> key = AttributeKey.valueOf("user");
channel.attr(key).set(userId);
}
public void online2(Channel channel, String userId) {
}
/**
* 根据用户id获取该用户的通道
*
* @param userId
* @return
*/
public static Channel getChannelByUserId(String userId) {
return serverChannelMap.get(userId);
}
/**
* 根据通道获取该用户的tocken
*
* @param channel
* @return
*/
public static String getTokenByChannel(Channel channel) {
return serverChannelMapInversion.get(channel);
}
/**
* 判断一个用户是否在线
*
* @param userId
* @return
*/
public static Boolean online(String userId) {
return serverChannelMap.containsKey(userId) && serverChannelMap.get(userId) != null;
}
}
版权声明:本文为zhangMY12138原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。