【无标题】Netty 保存通道与用户的信息


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版权协议,转载请附上原文出处链接和本声明。