handleChannelTypeAdvancedList) {
+ this.handleChannelTypeAdvancedList = handleChannelTypeAdvancedList;
+ return this;
+ }
+ /**
+ * 服务端地址信息
+ *
+ * @param nettyClientProperties 客户服务端地址配置属性
+ * @return 返回当前对象
+ */
+ public NettyVisitorSocketBuilder builderNettyClientProperties(NettyClientProperties nettyClientProperties) {
+ this.nettyClientProperties = nettyClientProperties;
+ return this;
+ }
+
+
+ public NettyUdpClientPermeateServerVisitorSocket build() {
+ if (clientTargetIp == null) {
+ throw new IllegalArgumentException("clientTargetIp must not null");
+ }
+ if (clientTargetPort == null) {
+ throw new IllegalArgumentException("clientTargetPort must not null");
+ }
+ if (visitorPort == null) {
+ throw new IllegalArgumentException("visitorPort must not null");
+ }
+ InternalNetworkClientPermeateServerVisitor internalNetworkClientPermeateServerVisitor = new InternalNetworkClientPermeateServerVisitor();
+
+ internalNetworkClientPermeateServerVisitor.setTargetIp(clientTargetIp);
+ internalNetworkClientPermeateServerVisitor.setTargetPort(clientTargetPort);
+ internalNetworkClientPermeateServerVisitor.setVisitorPort(visitorPort);
+ internalNetworkClientPermeateServerVisitor.setNettyClientProperties(nettyClientProperties);
+ internalNetworkClientPermeateServerVisitor.setHandleChannelTypeAdvancedList(handleChannelTypeAdvancedList);
+
+
+ NettyUdpClientPermeateServerVisitorFilter nettyUdpClientPermeateServerVisitorFilter = new NettyUdpClientPermeateServerVisitorFilter(internalNetworkClientPermeateServerVisitor);
+ return new NettyUdpClientPermeateServerVisitorSocket(nettyUdpClientPermeateServerVisitorFilter, clientId, visitorPort);
+ }
+
+
+ }
+
+}
\ No newline at end of file
diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpClientPermeateServerVisitorTransferSocket.java b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpClientPermeateServerVisitorTransferSocket.java
new file mode 100644
index 0000000..529f96f
--- /dev/null
+++ b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpClientPermeateServerVisitorTransferSocket.java
@@ -0,0 +1,100 @@
+package org.framework.lazy.cloud.network.heartbeat.client.netty.udp.socket;
+
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.framework.lazy.cloud.network.heartbeat.client.config.NettyClientProperties;
+import org.framework.lazy.cloud.network.heartbeat.client.netty.InternalNetworkClientPermeateServerVisitor;
+import org.framework.lazy.cloud.network.heartbeat.client.netty.udp.filter.NettyUdpClientPermeateServerTransferFilter;
+import org.framework.lazy.cloud.network.heartbeat.common.UdpMessageType;
+import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
+import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelTypeAdapter;
+import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 客户端渗透服务端传输通道
+ */
+@Slf4j
+public class NettyUdpClientPermeateServerVisitorTransferSocket {
+ static EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+
+ /**
+ * 连接服务端通信通道
+ *
+ * internalNetworkClientPermeateServerVisitor
+ */
+ public static void buildTransferServer(InternalNetworkClientPermeateServerVisitor internalNetworkClientPermeateServerVisitor, Channel visitorChannel) {
+
+ Bootstrap bootstrap = new Bootstrap();
+ bootstrap.group(eventLoopGroup)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.SO_KEEPALIVE, true)
+ // 设置读缓冲区为2M
+ .option(ChannelOption.SO_RCVBUF, 2048 * 1024)
+ // 设置写缓冲区为1M
+ .option(ChannelOption.SO_SNDBUF, 1024 * 1024)
+// .option(ChannelOption.UDP_NODELAY, false)
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000 * 60)//连接超时时间设置为 60 秒
+// .option(ChannelOption.SO_BACKLOG, 256)//务端接受连接的队列长度 默认128
+// .option(ChannelOption.RCVBUF_ALLOCATOR, new NettyRecvByteBufAllocator(1024 * 1024))//用于Channel分配接受Buffer的分配器 默认AdaptiveRecvByteBufAllocator.DEFAULT
+
+ .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
+
+ .handler(new NettyUdpClientPermeateServerTransferFilter(new ChannelTypeAdapter(internalNetworkClientPermeateServerVisitor.getHandleChannelTypeAdvancedList())))
+ ;
+ NettyClientProperties nettyClientProperties = internalNetworkClientPermeateServerVisitor.getNettyClientProperties();
+ String inetHost = nettyClientProperties.getInetHost();
+ int inetPort = nettyClientProperties.getInetPort();
+ // local client id
+
+ String clientId = nettyClientProperties.getClientId();
+
+ String targetIp = internalNetworkClientPermeateServerVisitor.getTargetIp();
+ Integer targetPort = internalNetworkClientPermeateServerVisitor.getTargetPort();
+
+ String visitorId = ChannelAttributeKeyUtils.getVisitorId(visitorChannel);
+ Integer visitorPort = internalNetworkClientPermeateServerVisitor.getVisitorPort();
+
+ // 客户端新建访客通道 连接服务端IP:{},连接服务端端口:{}
+ log.debug("Client creates a new visitor channel to connect to server IP: {}, connecting to server port: {}", inetHost, inetPort);
+ ChannelFuture future = bootstrap.connect(inetHost, inetPort);
+
+ // 使用的客户端ID:{}
+ log.info("Client ID used: {}", clientId);
+ future.addListener((ChannelFutureListener) futureListener -> {
+ Channel transferChannel = futureListener.channel();
+ if (futureListener.isSuccess()) {
+
+ NettyProxyMsg myMsg = new NettyProxyMsg();
+ myMsg.setType(UdpMessageType.UDP_REPORT_CLIENT_TRANSFER_SERVER_PERMEATE_CHANNEL_CONNECTION_SUCCESSFUL);
+ myMsg.setClientId(clientId);
+ myMsg.setVisitorPort(visitorPort);
+ myMsg.setClientTargetIp(targetIp);
+ myMsg.setClientTargetPort(targetPort);
+ myMsg.setVisitorId(visitorId);
+ ChannelAttributeKeyUtils.buildVisitorId(transferChannel, visitorId);
+ ChannelAttributeKeyUtils.buildClientId(transferChannel, clientId);
+ // 传输通道打开后自动读取
+ ChannelAttributeKeyUtils.buildNextChannel(visitorChannel, transferChannel);
+ ChannelAttributeKeyUtils.buildNextChannel(transferChannel, visitorChannel);
+
+ transferChannel.writeAndFlush(myMsg);
+
+ } else {
+ log.warn("客户端渗透服务端通信通道中断....");
+ eventLoopGroup.schedule(() -> {
+ try {
+ buildTransferServer(internalNetworkClientPermeateServerVisitor, visitorChannel);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }, 2, TimeUnit.SECONDS);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpClientSocket.java b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpClientSocket.java
new file mode 100644
index 0000000..6396d08
--- /dev/null
+++ b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpClientSocket.java
@@ -0,0 +1,143 @@
+package org.framework.lazy.cloud.network.heartbeat.client.netty.udp.socket;
+
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.framework.lazy.cloud.network.heartbeat.client.netty.event.ClientChangeEvent;
+import org.framework.lazy.cloud.network.heartbeat.client.netty.udp.filter.NettyUdpClientFilter;
+import org.framework.lazy.cloud.network.heartbeat.common.UdpMessageType;
+import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
+import org.framework.lazy.cloud.network.heartbeat.common.NettyServerContext;
+import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelTypeAdapter;
+import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
+import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
+
+import java.net.InetAddress;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 客户端连接服务端
+ */
+@Slf4j
+public class NettyUdpClientSocket {
+ private final EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+ /**
+ * 服务端host
+ */
+ private final String inetHost;
+ /**
+ * 服务端端口
+ */
+ private final int inetPort;
+ /**
+ * 当前客户端id
+ */
+ @Getter
+ private final String clientId;
+
+ /**
+ * 当前连接的服务端ID
+ */
+ private final String serverId;
+ private final String appKey;
+ private final String appSecret;
+ /**
+ * 客户端状态变更事件
+ */
+ @Getter
+ private final ClientChangeEvent clientChangeEvent;
+ private final List handleChannelTypeAdvancedList; // 处理服务端发送过来的数据类型
+
+ public NettyUdpClientSocket(String inetHost,
+ int inetPort,
+ String clientId,
+ String serverId,
+ String appKey,
+ String appSecret,
+ ClientChangeEvent clientChangeEvent,
+ List handleChannelTypeAdvancedList) {
+ this.inetHost = inetHost;
+ this.inetPort = inetPort;
+ this.clientId = clientId;
+ this.serverId = serverId;
+ this.appKey = appKey;
+ this.appSecret = appSecret;
+ this.clientChangeEvent = clientChangeEvent;
+ this.handleChannelTypeAdvancedList = handleChannelTypeAdvancedList;
+ }
+
+ public void newConnect2Server() throws InterruptedException {
+ newConnect2Server(inetHost, inetPort, clientId, serverId, clientChangeEvent);
+ }
+
+ protected void newConnect2Server(String inetHost, int inetPort, String clientId, String serverId, ClientChangeEvent clientChangeEvent) throws InterruptedException {
+ Bootstrap bootstrap = new Bootstrap();
+ bootstrap.group(eventLoopGroup)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.SO_RCVBUF, 2048 * 1024)
+ // 设置写缓冲区为1M
+ .option(ChannelOption.SO_SNDBUF, 1024 * 1024)
+
+ .option(ChannelOption.SO_KEEPALIVE, true)
+// .childOption(ChannelOption.UDP_NODELAY, false)
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000 * 60)//连接超时时间设置为 60 秒
+// .childOption(ChannelOption.RCVBUF_ALLOCATOR, new NettyRecvByteBufAllocator(1024 * 1024))//用于Channel分配接受Buffer的分配器 默认AdaptiveRecvByteBufAllocator.DEFAULT
+ .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
+ .handler(new NettyUdpClientFilter(new ChannelTypeAdapter(handleChannelTypeAdvancedList), this))
+ ;
+ log.info("use clientId:{} connect to server IP:{},server port :{}", clientId, inetHost, inetPort);
+ ChannelFuture future = bootstrap.connect(inetHost, inetPort);
+ // 客户端连接服务端的channel
+ Channel serviceChannel = future.channel();
+
+ future.addListener((ChannelFutureListener) futureListener -> {
+ if (futureListener.isSuccess()) {
+
+ log.info("clientId:{},connect to server IP:{},server port :{} isSuccess ", clientId, inetHost, inetPort);
+ // 告诉服务端这条连接是client的连接
+ NettyProxyMsg nettyMsg = new NettyProxyMsg();
+ nettyMsg.setType(UdpMessageType.UDP_REPORT_CLIENT_CONNECT_SUCCESS);
+ nettyMsg.setClientId(clientId);
+ String hostAddress = InetAddress.getLocalHost().getHostAddress();
+ nettyMsg.setOriginalIpString(hostAddress);
+ nettyMsg.setData((clientId).getBytes());
+ nettyMsg.setAppKeyString(appKey);
+ nettyMsg.setAppSecretString(appSecret);
+ ChannelAttributeKeyUtils.buildClientId(serviceChannel, clientId);
+ serviceChannel.writeAndFlush(nettyMsg);
+
+ NettyServerContext.pushServerEndpointChannel(serverId, clientId, serviceChannel);
+ // 在线 客户端注册服务端成功
+ clientChangeEvent.clientOnLine(inetHost, inetPort,serverId, clientId);
+ } else {
+ log.warn("Reconnect every 2 seconds....");
+ // 离线
+ NettyServerContext.removeServerEndpointChannels(serverId, clientId);
+ clientChangeEvent.clientOffLine(inetHost, inetPort,serverId, clientId);
+ eventLoopGroup.schedule(() -> {
+ try {
+ newConnect2Server(inetHost, inetPort, clientId, serverId, clientChangeEvent);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }, 2, TimeUnit.SECONDS);
+ }
+ });
+ }
+
+ /**
+ * 关闭连接
+ */
+
+ public void shutdown() {
+ if ((eventLoopGroup != null) && (!eventLoopGroup.isShutdown())) {
+ eventLoopGroup.shutdownGracefully();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpServerPermeateClientRealSocket.java b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpServerPermeateClientRealSocket.java
new file mode 100644
index 0000000..cf52313
--- /dev/null
+++ b/wu-lazy-cloud-heartbeat-client/src/main/java/org/framework/lazy/cloud/network/heartbeat/client/netty/udp/socket/NettyUdpServerPermeateClientRealSocket.java
@@ -0,0 +1,217 @@
+package org.framework.lazy.cloud.network.heartbeat.client.netty.udp.socket;
+
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import lombok.extern.slf4j.Slf4j;
+import org.framework.lazy.cloud.network.heartbeat.client.config.NettyClientProperties;
+import org.framework.lazy.cloud.network.heartbeat.client.netty.udp.filter.NettyUdpServerPermeateClientRealFilter;
+import org.framework.lazy.cloud.network.heartbeat.client.netty.udp.filter.NettyUdpServerPermeateClientTransferFilter;
+import org.framework.lazy.cloud.network.heartbeat.common.InternalNetworkPenetrationRealClient;
+import org.framework.lazy.cloud.network.heartbeat.common.NettyCommunicationIdContext;
+import org.framework.lazy.cloud.network.heartbeat.common.NettyProxyMsg;
+import org.framework.lazy.cloud.network.heartbeat.common.UdpMessageType;
+import org.framework.lazy.cloud.network.heartbeat.common.adapter.ChannelTypeAdapter;
+import org.framework.lazy.cloud.network.heartbeat.common.advanced.HandleChannelTypeAdvanced;
+import org.framework.lazy.cloud.network.heartbeat.common.utils.ChannelAttributeKeyUtils;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 客户端连接真实服务
+ */
+@Slf4j
+public class NettyUdpServerPermeateClientRealSocket {
+ static EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
+
+ /**
+ * 连接真实服务
+ *
+ * @param internalNetworkPenetrationRealClient 访客信息
+ * @param nettyClientProperties 服务端地址信息
+ */
+ public static void buildRealServer(InternalNetworkPenetrationRealClient internalNetworkPenetrationRealClient,
+ NettyClientProperties nettyClientProperties,
+ List handleChannelTypeAdvancedList) {
+
+ buildNewRealServer(internalNetworkPenetrationRealClient, nettyClientProperties, handleChannelTypeAdvancedList);
+
+ }
+
+ /**
+ * @param internalNetworkPenetrationRealClient 访客信息
+ * @param nettyClientProperties 服务端地址信息
+ */
+ private static void buildNewRealServer(InternalNetworkPenetrationRealClient internalNetworkPenetrationRealClient,
+ NettyClientProperties nettyClientProperties,
+ List handleChannelTypeAdvancedList) {
+ try {
+ String clientId = internalNetworkPenetrationRealClient.getClientId();
+ String clientTargetIp = internalNetworkPenetrationRealClient.getClientTargetIp();
+ Integer clientTargetPort = internalNetworkPenetrationRealClient.getClientTargetPort();
+ Integer visitorPort = internalNetworkPenetrationRealClient.getVisitorPort();
+ String visitorId = internalNetworkPenetrationRealClient.getVisitorId();
+ Bootstrap bootstrap = new Bootstrap();
+ bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class)
+// 设置读缓冲区为2M
+ .option(ChannelOption.SO_RCVBUF, 2048 * 1024)
+// 设置写缓冲区为1M
+ .option(ChannelOption.SO_SNDBUF, 1024 * 1024)
+// .option(ChannelOption.UDP_NODELAY, false)
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000 * 60)//连接超时时间设置为 60 秒
+// .option(ChannelOption.SO_BACKLOG, 128)//务端接受连接的队列长度 默认128
+// .option(ChannelOption.RCVBUF_ALLOCATOR, new NettyRecvByteBufAllocator(1024 * 1024))//用于Channel分配接受Buffer的分配器 默认AdaptiveRecvByteBufAllocator.DEFAULT
+ .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
+ .handler(new NettyUdpServerPermeateClientRealFilter())
+
+ ;
+
+
+ bootstrap.connect(clientTargetIp, clientTargetPort).addListener((ChannelFutureListener) future -> {
+ if (future.isSuccess()) {
+ // 客户端链接真实服务成功 设置自动读写false 等待访客连接成功后设置成true
+ Channel realChannel = future.channel();
+ realChannel.config().setOption(ChannelOption.AUTO_READ, false);
+
+ log.info("访客通过 客户端:【{}】,绑定本地服务,IP:{},端口:{} 新建通道成功", clientId, clientTargetIp, clientTargetPort);
+ // 客户端真实通道
+// NettyRealIdContext.pushReal(realChannel, visitorId);
+ // 绑定访客ID到当前真实通道属性
+ ChannelAttributeKeyUtils.buildVisitorId(realChannel, visitorId);
+ ChannelAttributeKeyUtils.buildClientId(realChannel, clientId);
+ ChannelAttributeKeyUtils.buildVisitorPort(realChannel, visitorPort);
+ // 通知服务端访客连接成功
+
+
+ // 新建一个通道处理
+ newVisitorConnect2Server(internalNetworkPenetrationRealClient, nettyClientProperties, handleChannelTypeAdvancedList,realChannel);
+
+ // 是否等 服务端相应访客通道已经可以自动读写
+// realChannel.config().setOption(ChannelOption.AUTO_READ, true);
+ // 模拟发送
+ String byteData = "GET /swagger-ui/index.html HTTP/1.1\n" +
+ "Host: 127.0.0.1:19080\n" +
+ "Connection: keep-alive\n" +
+ "Cache-Control: max-age=0\n" +
+ "sec-ch-ua: \"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"\n" +
+ "sec-ch-ua-mobile: ?0\n" +
+ "sec-ch-ua-platform: \"macOS\"\n" +
+ "Upgrade-Insecure-Requests: 1\n" +
+ "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\n" +
+ "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\n" +
+ "Sec-Fetch-Site: none\n" +
+ "Sec-Fetch-Mode: navigate\n" +
+ "Sec-Fetch-User: ?1\n" +
+ "Sec-Fetch-Dest: document\n" +
+ "Accept-Encoding: gzip, deflate, br\n" +
+ "Accept-Language: zh-CN,zh;q=0.9\n" +
+ "Cookie: XXL_JOB_LOGIN_IDENTITY=7b226964223a312c22757365726e616d65223a2261646d696e222c2270617373776f7264223a226531306164633339343962613539616262653536653035376632306638383365222c22726f6c65223a312c227065726d697373696f6e223a6e756c6c7d; Hm_lvt_173e771eef816c412396d2cb4fe2d632=1703040917\n";
+// ChannelContext.ClientChannel clientChannel = ChannelContext.get(String.valueOf(visitorPort).getBytes(StandardCharsets.UTF_8));
+// Channel channel = clientChannel.getChannel();
+// channel.writeAndFlush(byteData.getBytes(StandardCharsets.UTF_8));
+// future.channel().attr(Constant.VID).set(internalNetworkPenetrationRealClient);
+// Constant.vrc.put(internalNetworkPenetrationRealClient, future.channel());
+// ProxySocket.connectProxyServer(internalNetworkPenetrationRealClient);
+ } else {
+ log.error("客户:【{}】,无法连接当前网络内的目标IP:【{}】,目标端口:【{}】", clientId, clientTargetIp, clientTargetPort);
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * 创建访客连接服务端
+ *
+ * @param internalNetworkPenetrationRealClient 内网穿透信息
+ * @param nettyClientProperties 服务端配置信息
+ * @param handleChannelTypeAdvancedList 处理器适配器
+ * @throws InterruptedException 异常
+ */
+ protected static void newVisitorConnect2Server(InternalNetworkPenetrationRealClient internalNetworkPenetrationRealClient,
+ NettyClientProperties nettyClientProperties,
+ List handleChannelTypeAdvancedList,
+ Channel realChannel) throws InterruptedException {
+ Bootstrap bootstrap = new Bootstrap();
+ bootstrap.group(eventLoopGroup)
+ .channel(NioSocketChannel.class)
+ .option(ChannelOption.SO_KEEPALIVE, true)
+ // 设置读缓冲区为2M
+ .option(ChannelOption.SO_RCVBUF, 2048 * 1024)
+ // 设置写缓冲区为1M
+ .option(ChannelOption.SO_SNDBUF, 1024 * 1024)
+// .option(ChannelOption.UDP_NODELAY, false)
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000 * 60)//连接超时时间设置为 60 秒
+// .option(ChannelOption.SO_BACKLOG, 256)//务端接受连接的队列长度 默认128
+// .option(ChannelOption.RCVBUF_ALLOCATOR, new NettyRecvByteBufAllocator(1024 * 1024))//用于Channel分配接受Buffer的分配器 默认AdaptiveRecvByteBufAllocator.DEFAULT
+
+ .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2))
+
+ .handler(new NettyUdpServerPermeateClientTransferFilter(new ChannelTypeAdapter(handleChannelTypeAdvancedList)))
+ ;
+
+ String inetHost = nettyClientProperties.getInetHost();
+ int inetPort = nettyClientProperties.getInetPort();
+ // local client id
+
+ String clientId = nettyClientProperties.getClientId();
+
+
+ String visitorId = internalNetworkPenetrationRealClient.getVisitorId();
+ Integer visitorPort = internalNetworkPenetrationRealClient.getVisitorPort();
+ String clientTargetIp = internalNetworkPenetrationRealClient.getClientTargetIp();
+ Integer clientTargetPort = internalNetworkPenetrationRealClient.getClientTargetPort();
+ String visitorClientId = internalNetworkPenetrationRealClient.getClientId();
+
+ // 客户端新建访客通道 连接服务端IP:{},连接服务端端口:{}
+ log.info("Client creates a new visitor channel to connect to server IP: {}, connecting to server port: {}", inetHost, inetPort);
+ ChannelFuture future = bootstrap.connect(inetHost, inetPort);
+
+ // 使用的客户端ID:{}
+ log.info("Client ID used: {}" , visitorClientId);
+ future.addListener((ChannelFutureListener) futureListener -> {
+ Channel transferChannel = futureListener.channel();
+ if (futureListener.isSuccess()) {
+
+ NettyProxyMsg myMsg = new NettyProxyMsg();
+ myMsg.setType(UdpMessageType.UDP_REPORT_SINGLE_CLIENT_REAL_CONNECT);
+ myMsg.setClientId(visitorClientId);
+ myMsg.setVisitorPort(visitorPort);
+ myMsg.setClientTargetIp(clientTargetIp);
+ myMsg.setClientTargetPort(clientTargetPort);
+
+ myMsg.setVisitorId(visitorId);
+ transferChannel.writeAndFlush(myMsg);
+ // 绑定客户端真实通信通道
+ NettyCommunicationIdContext.pushVisitor(transferChannel, visitorId);
+ ChannelAttributeKeyUtils.buildVisitorId(transferChannel, visitorId);
+ ChannelAttributeKeyUtils.buildClientId(transferChannel, visitorClientId);
+ // 客户端真实通道自动读写打开
+
+ realChannel.config().setOption(ChannelOption.AUTO_READ, true);
+
+ ChannelAttributeKeyUtils.buildNextChannel(realChannel, transferChannel);
+ ChannelAttributeKeyUtils.buildNextChannel(transferChannel, realChannel);
+
+
+
+
+ } else {
+ log.info("每隔2s重连....");
+ // 离线
+ eventLoopGroup.schedule(() -> {
+ try {
+ newVisitorConnect2Server(internalNetworkPenetrationRealClient, nettyClientProperties, handleChannelTypeAdvancedList,realChannel);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }, 2, TimeUnit.SECONDS);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring.factories b/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring.factories
index edede42..14bb175 100644
--- a/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring.factories
+++ b/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring.factories
@@ -1,6 +1,5 @@
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.framework.lazy.cloud.network.heartbeat.client.EnableHeartbeatClientAutoConfiguration,\
+org.framework.lazy.cloud.network.heartbeat.client.EnableClientAutoConfiguration,\
org.framework.lazy.cloud.network.heartbeat.client.config.NettyClientProperties,\
-org.framework.lazy.cloud.network.heartbeat.client.config.InitConfig,\
org.framework.lazy.cloud.network.heartbeat.client.config.ClientAutoConfiguration
diff --git a/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index cdfba9a..bf07c43 100644
--- a/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/wu-lazy-cloud-heartbeat-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,4 +1,3 @@
-org.framework.lazy.cloud.network.heartbeat.client.EnableHeartbeatClientAutoConfiguration
+org.framework.lazy.cloud.network.heartbeat.client.EnableClientAutoConfiguration
org.framework.lazy.cloud.network.heartbeat.client.config.NettyClientProperties
-org.framework.lazy.cloud.network.heartbeat.client.config.InitConfig
org.framework.lazy.cloud.network.heartbeat.client.config.ClientAutoConfiguration
diff --git a/wu-lazy-cloud-heartbeat-common/pom.xml b/wu-lazy-cloud-heartbeat-common/pom.xml
index e2d164d..a178c4e 100644
--- a/wu-lazy-cloud-heartbeat-common/pom.xml
+++ b/wu-lazy-cloud-heartbeat-common/pom.xml
@@ -6,7 +6,7 @@
top.wu2020
wu-lazy-cloud-network
- 1.2.9-JDK17-SNAPSHOT
+ 1.3.0-JDK17-SNAPSHOT
wu-lazy-cloud-heartbeat-common
diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/UdpMessageType.java b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/UdpMessageType.java
index ef284f2..4f2a110 100644
--- a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/UdpMessageType.java
+++ b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/UdpMessageType.java
@@ -1,6 +1,7 @@
package org.framework.lazy.cloud.network.heartbeat.common;
+import org.framework.lazy.cloud.network.heartbeat.common.advanced.tcp.AbstractTcpHandleChannelHeartbeatTypeAdvanced;
import org.framework.lazy.cloud.network.heartbeat.common.advanced.udp.client.*;
import org.framework.lazy.cloud.network.heartbeat.common.advanced.udp.server.*;
import org.framework.lazy.cloud.network.heartbeat.common.enums.MessageTypeEnums;
@@ -14,6 +15,15 @@ import org.framework.lazy.cloud.network.heartbeat.common.enums.MessageTypeEnums;
* UDP: 64~128
*/
public class UdpMessageType {
+
+ /**
+ * 心跳
+ *
+ * @see MessageTypeEnums#TCP_TYPE_HEARTBEAT
+ * @see AbstractTcpHandleChannelHeartbeatTypeAdvanced
+ */
+ public static final byte UDP_TYPE_HEARTBEAT = 0X00;
+
/**
* 客户端UDP 上报连接成功
*
diff --git a/wu-lazy-cloud-heartbeat-server-cluster/pom.xml b/wu-lazy-cloud-heartbeat-server-cluster/pom.xml
index e84968d..312e2cf 100644
--- a/wu-lazy-cloud-heartbeat-server-cluster/pom.xml
+++ b/wu-lazy-cloud-heartbeat-server-cluster/pom.xml
@@ -5,7 +5,7 @@
top.wu2020
wu-lazy-cloud-network
- 1.2.9-JDK17-SNAPSHOT
+ 1.3.0-JDK17-SNAPSHOT
4.0.0
diff --git a/wu-lazy-cloud-heartbeat-server/pom.xml b/wu-lazy-cloud-heartbeat-server/pom.xml
index 9736e0f..aca7cf0 100644
--- a/wu-lazy-cloud-heartbeat-server/pom.xml
+++ b/wu-lazy-cloud-heartbeat-server/pom.xml
@@ -5,7 +5,7 @@
top.wu2020
wu-lazy-cloud-network
- 1.2.9-JDK17-SNAPSHOT
+ 1.3.0-JDK17-SNAPSHOT
4.0.0
diff --git a/wu-lazy-cloud-heartbeat-start/pom.xml b/wu-lazy-cloud-heartbeat-start/pom.xml
index 3a7653a..75d3c0e 100644
--- a/wu-lazy-cloud-heartbeat-start/pom.xml
+++ b/wu-lazy-cloud-heartbeat-start/pom.xml
@@ -5,7 +5,7 @@
top.wu2020
wu-lazy-cloud-network
- 1.2.9-JDK17-SNAPSHOT
+ 1.3.0-JDK17-SNAPSHOT
wu-lazy-cloud-heartbeat-start
diff --git a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md
index b719edd..e3539a2 100644
--- a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md
+++ b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/README.md
@@ -9,7 +9,7 @@ mvn -Pnative -DskipTests clean package native:compile
```shell
mvn spring-boot:build-image -Pnative
-docker tag docker.io/library/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-SNAPSHOT registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-NATIVE-SNAPSHOT
+docker tag docker.io/library/wu-lazy-cloud-heartbeat-client-start:1.3.0-JDK17-SNAPSHOT registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-NATIVE-SNAPSHOT
docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-NATIVE-SNAPSHOT
@@ -24,8 +24,8 @@ docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-cl
mvn clean install
-docker build -t registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-SNAPSHOT .
-docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-SNAPSHOT
+docker build -t registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.3.0-JDK17-SNAPSHOT .
+docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.3.0-JDK17-SNAPSHOT
```
@@ -33,7 +33,7 @@ docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-cl
### run
```shell
-docker run -d -it --privileged --name client -p 6004:6004 registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-SNAPSHOT
+docker run -d -it --privileged --name client -p 6004:6004 registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.3.0-JDK17-SNAPSHOT
```
@@ -73,7 +73,7 @@ kubeadm join apiserver.demo:6443 --token 2wtcsg.0af26p9wzfgvyf5a --discovery
```
```RUN
-docker run -d -it --name client registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.2.9-JDK17-SNAPSHOT
+docker run -d -it --name client registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-client-start:1.3.0-JDK17-SNAPSHOT
http://127.0.0.1:18080
diff --git a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/pom.xml b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/pom.xml
index 325cab7..5e18e9d 100644
--- a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/pom.xml
+++ b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-client-start/pom.xml
@@ -5,7 +5,7 @@
top.wu2020
wu-lazy-cloud-heartbeat-start
- 1.2.9-JDK17-SNAPSHOT
+ 1.3.0-JDK17-SNAPSHOT
4.0.0
diff --git a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-cluster-start/pom.xml b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-cluster-start/pom.xml
index 19a0881..493e127 100644
--- a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-cluster-start/pom.xml
+++ b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-cluster-start/pom.xml
@@ -5,7 +5,7 @@
top.wu2020
wu-lazy-cloud-heartbeat-start
- 1.2.9-JDK17-SNAPSHOT
+ 1.3.0-JDK17-SNAPSHOT
4.0.0
diff --git a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/README.md b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/README.md
index a2833c9..8efeb1f 100644
--- a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/README.md
+++ b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/README.md
@@ -11,7 +11,7 @@ mvn -Pnative -DskipTests clean package native:compile
```shell
mvn spring-boot:build-image -Pnative
-docker tag docker.io/library/wu-lazy-cloud-heartbeat-server-start:1.2.9-JDK17-SNAPSHOT registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server-start:1.2.9-JDK17-NATIVE-SNAPSHOT
+docker tag docker.io/library/wu-lazy-cloud-heartbeat-server-start:1.3.0-JDK17-SNAPSHOT registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server-start:1.2.9-JDK17-NATIVE-SNAPSHOT
docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server-start:1.2.9-JDK17-NATIVE-SNAPSHOT
@@ -23,8 +23,8 @@ docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-se
mvn clean install
-docker build -t registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server-start:1.2.9-JDK17-SNAPSHOT .
-docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server-start:1.2.9-JDK17-SNAPSHOT
+docker build -t registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server-start:1.3.0-JDK17-SNAPSHOT .
+docker push registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server-start:1.3.0-JDK17-SNAPSHOT
```
diff --git a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/pom.xml b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/pom.xml
index 37da2de..edee522 100644
--- a/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/pom.xml
+++ b/wu-lazy-cloud-heartbeat-start/wu-lazy-cloud-heartbeat-server-start/pom.xml
@@ -5,7 +5,7 @@
top.wu2020
wu-lazy-cloud-heartbeat-start
- 1.2.9-JDK17-SNAPSHOT
+ 1.3.0-JDK17-SNAPSHOT
4.0.0