diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java index d1b44022..d3de5ef8 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java @@ -59,6 +59,13 @@ public class ProxyTunnelChannelHandler extends SimpleChannelInboundHandler { - Channel proxyChannel = channel.attr(Constants.NEXT_CHANNEL).get(); + String visitorId = ProxyUtil.getVisitorIdBySocketAddress(datagramPacket.sender()); + if (StrUtil.isBlank(visitorId)) { + return; + } + Channel proxyChannel = ProxyUtil.getTunnelChannelByVisitorId(visitorId); +// Channel proxyChannel = channel.attr(Constants.NEXT_CHANNEL).get(); if (null == proxyChannel) { // // 该端口还没有代理客户端 @@ -50,7 +55,6 @@ public class UdpVisitorChannelHandler extends SimpleChannelInboundHandler licenseIdToClientIdMap = new HashMap<>(); + /** + * visitorId - SocketAddress映射 + */ + private static Map visitorIdToSocketAddressMap = new HashMap<>(); + /** + * SocketAddress - visitorId 映射 + */ + private static Map socketAddressToVisitorIdMap = new HashMap<>(); + /** + * visitorId - tunnelChannel 映射 + */ + private static Map visitorIdToTunnelChannelMap = new HashMap<>(); /** * 初始化代理信息 @@ -479,4 +492,34 @@ public class ProxyUtil { public static void removeClientIdByLicenseId(Integer licenseId) { licenseIdToClientIdMap.remove(licenseId); } + + public static void setVisitorIdToSocketAddressMap(String visitorId, SocketAddress socketAddress) { + visitorIdToSocketAddressMap.put(visitorId, socketAddress); + socketAddressToVisitorIdMap.put(socketAddress, visitorId); + } + + public static SocketAddress getSocketAddressByVisitorId(String visitorId) { + return visitorIdToSocketAddressMap.get(visitorId); + } + + public static void removeSocketAddressByVisitorId(String visitorId) { + SocketAddress socketAddress = visitorIdToSocketAddressMap.get(visitorId); + visitorIdToSocketAddressMap.remove(visitorId); + socketAddressToVisitorIdMap.remove(socketAddress); + + visitorIdToTunnelChannelMap.remove(visitorId); + } + + public static String getVisitorIdBySocketAddress(SocketAddress socketAddress) { + return socketAddressToVisitorIdMap.get(socketAddress); + } + + public static void setVisitorIdToTunnelChannelMap(String visitorId, Channel tunnelChannel) { + visitorIdToTunnelChannelMap.put(visitorId, tunnelChannel); + } + + public static Channel getTunnelChannelByVisitorId(String visitorId) { + return visitorIdToTunnelChannelMap.get(visitorId); + } + }