package gate.utils; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.ConcurrentHashMap; /** * Created by Dell on 2016/2/2. */ public class ClientConnectionMap { private static final Logger logger = LoggerFactory.getLogger(ClientConnectionMap.class); //保存一个gateway上所有的客户端连接 public static ConcurrentHashMap<Long, ClientConnection> allClientMap = new ConcurrentHashMap<>(); private static ConcurrentHashMap<String, Long> userid2netidMap = new ConcurrentHashMap<>(); public static ClientConnection getClientConnection(ChannelHandlerContext ctx) { Long netId = ctx.attr(ClientConnection.NETID).get(); ClientConnection conn = allClientMap.get(netId); if(conn != null) return conn; else { logger.error("ClientConenction not found in allClientMap, netId: {}", netId); } return null; } public static ClientConnection getClientConnection(long netId) { ClientConnection conn = allClientMap.get(netId); if(conn != null) return conn; else { logger.error("ClientConenction not found in allClientMap, netId: {}", netId); } return null; } public static void addClientConnection(ChannelHandlerContext c) { //fixme 之后重复登录需要踢掉原来的连接 ClientConnection conn = new ClientConnection(c); if(ClientConnectionMap.allClientMap.putIfAbsent(conn.getNetId(), conn) != null) { logger.error("Duplicated netid"); } } public static void removeClientConnection(ChannelHandlerContext c) { ClientConnection conn = getClientConnection(c); long netid = conn.getNetId(); String userid = conn.getUserId(); if(ClientConnectionMap.allClientMap.remove(netid) != null) { unRegisterUserid(userid); } else { logger.error("NetId: {} is not exist in allClientMap", netid); } logger.info("Client disconnected, netid: {}, userid: {}", netid, userid); } public static void registerUserid(String userid, long netId) { if(userid2netidMap.putIfAbsent(userid, netId) == null) { ClientConnection conn = ClientConnectionMap.getClientConnection(netId); if(conn != null) { conn.setUserId(userid); } else { logger.error("ClientConnection is null"); return; } } else { logger.error("userid: {} has registered in userid2netidMap", userid); } } protected static void unRegisterUserid(String userid) { if(ClientConnectionMap.userid2netidMap.remove(userid) == null) { logger.error("UserId: {} is not exist in userid2netidMap", userid); } } public static Long userid2netid(String userid) { Long netid = userid2netidMap.get(userid); if(netid != null) return netid; else { logger.error("User not login, userid: {}",userid); } return null; } }