diff --git a/neutrino-proxy-admin/src/views/proxy/portMapping.vue b/neutrino-proxy-admin/src/views/proxy/portMapping.vue
index c120ac41..9caf8f0e 100644
--- a/neutrino-proxy-admin/src/views/proxy/portMapping.vue
+++ b/neutrino-proxy-admin/src/views/proxy/portMapping.vue
@@ -168,6 +168,14 @@
.{{ domainName }}
+
+
+
+
+
+ 毫秒
+
+
@@ -281,7 +289,9 @@ export default {
serverPort: undefined,
clientIp: undefined,
clientPort: undefined,
- protocal: undefined
+ protocal: undefined,
+ proxyResponses: undefined,
+ proxyTimeoutMs: undefined
},
selectObj: {
statusOptions: [{ label: '启用', value: 1 }, { label: '禁用', value: 2 }],
@@ -431,7 +441,9 @@ export default {
serverPort: undefined,
clientIp: '127.0.0.1',
clientPort: undefined,
- userId: undefined
+ userId: undefined,
+ proxyResponses: undefined,
+ proxyTimeoutMs: undefined
}
this.serverPortList = []
this.loadServerPortQuery.licenseId = null;
diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java
index 48b833c0..cd9f9ea0 100644
--- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java
+++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java
@@ -1,8 +1,10 @@
package org.dromara.neutrinoproxy.client.util;
import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelFutureListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.neutrinoproxy.client.config.ProxyConfig;
@@ -174,10 +176,21 @@ public class UdpServerUtil {
System.currentTimeMillis() - lockChannel.getTakeTime().getTime() >= lockChannel.getProxyTimeoutMs()
) {
iter.remove();
+ UdpChannelBindInfo udpChannelBindInfo = lockChannel.getChannel().attr(Constants.UDP_CHANNEL_BIND_KEY).get();
+ // 此处必须释放代理隧道
+ closeChannel(udpChannelBindInfo.getTunnelChannel());
lockChannel.getChannel().attr(Constants.UDP_CHANNEL_BIND_KEY).set(null);
udpServerFreePortPool.offer(lockChannel.getPort());
log.debug("[udp channel]release udp channel port:{}", lockChannel.getPort());
}
}
}
+
+ private static void closeChannel(Channel channel) {
+ try {
+ channel.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
}
diff --git a/neutrino-proxy-client/src/main/resources/app.yml b/neutrino-proxy-client/src/main/resources/app.yml
index 89977937..3b869fb3 100644
--- a/neutrino-proxy-client/src/main/resources/app.yml
+++ b/neutrino-proxy-client/src/main/resources/app.yml
@@ -47,6 +47,6 @@ neutrino:
boss-thread-count: 5
work-thread-count: 20
# udp傀儡端口范围
- puppet-port-range: 10000-10100
+ puppet-port-range: 10000-10500
# 是否开启隧道传输报文日志(日志级别为debug时开启才有效)
transfer-log-enable: ${CLIENT_LOG:false}
diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java
index 5a3d916c..59c5175e 100644
--- a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java
+++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/Constants.java
@@ -40,6 +40,12 @@ public interface Constants {
AttributeKey TARGET_IP = AttributeKey.newInstance("targetIp");
AttributeKey TARGET_PORT = AttributeKey.newInstance("targetPort");
+ AttributeKey PROXY_RESPONSES = AttributeKey.newInstance("proxyResponses");
+ AttributeKey PROXY_TIMEOUT_MS = AttributeKey.newInstance("proxyTimeoutMs");
+
+ // 临时解决 udp channel被close的问题
+ AttributeKey IS_UDP_KEY = AttributeKey.newInstance("isUdp");
+
int HEADER_SIZE = 4;
int TYPE_SIZE = 1;
diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java
index 5a52640c..e9f536e0 100644
--- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java
+++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/PortMappingController.java
@@ -40,7 +40,7 @@ public class PortMappingController {
ParamCheckUtil.checkNotNull(req.getServerPort(), "serverPort");
ParamCheckUtil.checkNotNull(req.getClientPort(), "clientPort");
ParamCheckUtil.checkNotEmpty(req.getProtocal(), "protocal");
- ParamCheckUtil.checkMaxLength(req.getDescription(), 50, "描述", "50");
+ ParamCheckUtil.checkMaxLength(req.getDescription(), 50, "描述", "50");
if (StringUtils.isBlank(req.getClientIp())) {
// 没传客户端ip,默认为127.0.0.1
req.setClientIp("127.0.0.1");
@@ -52,6 +52,12 @@ public class PortMappingController {
req.setSubdomain(null);
}
req.setProtocal(networkProtocolEnum.getDesc());
+ if (null == req.getProxyResponses()) {
+ req.setProxyResponses(0);
+ }
+ if (null == req.getProxyTimeoutMs()) {
+ req.setProxyTimeoutMs(0L);
+ }
return portMappingService.create(req);
}
@@ -76,6 +82,12 @@ public class PortMappingController {
req.setSubdomain(null);
}
req.setProtocal(networkProtocolEnum.getDesc());
+ if (null == req.getProxyResponses()) {
+ req.setProxyResponses(0);
+ }
+ if (null == req.getProxyTimeoutMs()) {
+ req.setProxyTimeoutMs(0L);
+ }
return portMappingService.update(req);
}
diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java
index 3f6d7f2c..5270e8c6 100644
--- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java
+++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingCreateReq.java
@@ -54,6 +54,14 @@ public class PortMappingCreateReq {
* 客户端端口
*/
private Integer clientPort;
+ /**
+ * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数)
+ */
+ private Integer proxyResponses;
+ /**
+ * 代理超时时间
+ */
+ private Long proxyTimeoutMs;
/**
* 描述
*/
diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java
index 0ce46f64..5b1a94b9 100644
--- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java
+++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/PortMappingUpdateReq.java
@@ -58,6 +58,14 @@ public class PortMappingUpdateReq {
* 客户端端口
*/
private Integer clientPort;
+ /**
+ * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数)
+ */
+ private Integer proxyResponses;
+ /**
+ * 代理超时时间
+ */
+ private Long proxyTimeoutMs;
/**
* 描述
*/
diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java
index f378ede2..c0d95255 100644
--- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java
+++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingDetailRes.java
@@ -49,6 +49,14 @@ public class PortMappingDetailRes {
* {@link OnlineStatusEnum}
*/
private Integer isOnline;
+ /**
+ * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数)
+ */
+ private Integer proxyResponses;
+ /**
+ * 代理超时时间
+ */
+ private Long proxyTimeoutMs;
/**
* 启用状态
* {@link EnableStatusEnum}
diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java
index 1dcab22a..8a022cee 100644
--- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java
+++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/PortMappingListRes.java
@@ -89,6 +89,14 @@ public class PortMappingListRes {
* {@link EnableStatusEnum}
*/
private Integer enable;
+ /**
+ * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数)
+ */
+ private Integer proxyResponses;
+ /**
+ * 代理超时时间
+ */
+ private Long proxyTimeoutMs;
/**
* 描述
*/
diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java
index a36409a1..f83d656f 100644
--- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java
+++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/PortMappingDO.java
@@ -78,6 +78,14 @@ public class PortMappingDO {
* {@link OnlineStatusEnum}
*/
private Integer isOnline;
+ /**
+ * 代理响应数量(响应数据包数量,如果没有拆包则等于数据条数)
+ */
+ private Integer proxyResponses;
+ /**
+ * 代理超时时间
+ */
+ private Long proxyTimeoutMs;
/**
* 启用状态
* {@link EnableStatusEnum}
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 a3fc522e..d44cc9e2 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
@@ -89,8 +89,11 @@ public class ProxyTunnelChannelHandler extends SimpleChannelInboundHandler>>{}", ctx.channel().id().asLongText());
byte[] bytes = new byte[datagramPacket.content().readableBytes()];
datagramPacket.content().readBytes(bytes);
datagramPacket.content().resetReaderIndex();
@@ -36,12 +37,14 @@ public class UdpVisitorChannelHandler extends SimpleChannelInboundHandler