From da4b030234e62775143247da071cadd47aed7b25 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Mon, 27 Oct 2025 11:50:33 +0800 Subject: [PATCH] =?UTF-8?q?udp=E4=BB=A3=E7=90=86=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/core/UdpProxyChannelHandler.java | 12 +++-- .../client/core/UdpRealServerHandler.java | 2 + .../client/util/LockChannel.java | 4 +- .../client/util/UdpServerUtil.java | 48 +++++++++++++++---- 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpProxyChannelHandler.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpProxyChannelHandler.java index 8504e20f..4d940921 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpProxyChannelHandler.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpProxyChannelHandler.java @@ -63,16 +63,18 @@ public class UdpProxyChannelHandler extends SimpleChannelInboundHandler iter = lockChannelList.iterator(); if (iter.hasNext()) { LockChannel lockChannel = iter.next(); - if (lockChannel.getResponseCount() >= lockChannel.getProxyResponses() || - System.currentTimeMillis() - lockChannel.getTakeTime().getTime() >= lockChannel.getProxyTimeoutMs() + if ((lockChannel.getProxyResponses() > 0 && lockChannel.getResponseCount() >= lockChannel.getProxyResponses()) || + System.currentTimeMillis() - lockChannel.getLastActiveTime().getTime() > lockChannel.getProxyTimeoutMs() ) { iter.remove(); UdpChannelBindInfo udpChannelBindInfo = lockChannel.getChannel().attr(Constants.UDP_CHANNEL_BIND_KEY).get(); @@ -186,6 +203,17 @@ public class UdpServerUtil { closeChannel(udpChannelBindInfo.getTunnelChannel()); lockChannel.getChannel().attr(Constants.UDP_CHANNEL_BIND_KEY).set(null); udpServerFreePortPool.offer(lockChannel.getPort()); + + // 连接解绑 + Channel realServerChannel = lockChannel.getChannel(); + Channel tunnelChannel = realServerChannel.attr(org.dromara.neutrinoproxy.core.Constants.NEXT_CHANNEL).get(); + if (null != realServerChannel) { + realServerChannel.attr(org.dromara.neutrinoproxy.core.Constants.NEXT_CHANNEL).set(null); + } + if (null != tunnelChannel) { + tunnelChannel.attr(org.dromara.neutrinoproxy.core.Constants.NEXT_CHANNEL).set(null); + } + log.debug("[udp channel]release udp channel port:{}", lockChannel.getPort()); } }