diff --git a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelUtils.java b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelUtils.java index 03a7d530..fb5b33ef 100644 --- a/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelUtils.java +++ b/wu-lazy-cloud-heartbeat-common/src/main/java/org/framework/lazy/cloud/network/heartbeat/common/utils/ChannelUtils.java @@ -4,8 +4,12 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.nio.NioSocketChannel; + import lombok.extern.slf4j.Slf4j; +import java.net.Socket; + @Slf4j public class ChannelUtils { /** @@ -74,5 +78,36 @@ public class ChannelUtils { } } + /** + * 强制关闭Netty通道(跳过TCP优雅关闭,直接关闭套接字) + * @param channel Netty通道 + */ + public static void forceCloseChannel(Channel channel) { + if (channel == null || !channel.isOpen()) { + return; + } + try { + // 第一步:禁用通道读写,拒绝接收新数据 + channel.config().setAutoRead(false); + channel.config().setAutoClose(true); + + // 第二步:获取底层Socket,强制关闭(核心!抖音场景必须) + if (channel instanceof NioSocketChannel) { + NioSocketChannel nioChannel = (NioSocketChannel) channel; + Socket socket = nioChannel.javaChannel().socket(); + if (socket != null && !socket.isClosed()) { + socket.setSoLinger(true, 0); // 禁用SO_LINGER,立即关闭 + socket.close(); // 强制关闭Socket,切断TCP连接 + } + } + + // 第三步:关闭Netty通道(兜底) + channel.close().sync(); + log.info("通道已强制关闭"); + + } catch (Exception e) { + log.error("强制关闭通道异常:{}", e.getMessage()); + } + } } diff --git a/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/advanced/NettySocketProtocolHandleSocketLocalProxyTypeAdvanced.java b/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/advanced/NettySocketProtocolHandleSocketLocalProxyTypeAdvanced.java index ef40cac5..e39d52b5 100644 --- a/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/advanced/NettySocketProtocolHandleSocketLocalProxyTypeAdvanced.java +++ b/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/advanced/NettySocketProtocolHandleSocketLocalProxyTypeAdvanced.java @@ -48,7 +48,13 @@ public class NettySocketProtocolHandleSocketLocalProxyTypeAdvanced b.group(group) .channel(NioSocketChannel.class) - .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.SO_KEEPALIVE, true) // 开启TCP保活,检测无效连接 + .option(ChannelOption.TCP_NODELAY, true) // 关闭Nagle算法,适配直播流低延迟 + .option(ChannelOption.SO_RCVBUF, 2048 * 1024)// 设置读缓冲区为2M + .option(ChannelOption.SO_SNDBUF, 1024 * 1024)// 设置写缓冲区为1M + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000 * 60)//连接超时时间设置为 60 秒 + .option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 1024 * 1024 * 2)) + .handler(new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) throws Exception { diff --git a/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/handler/NettySocketBackendHandler.java b/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/handler/NettySocketBackendHandler.java index 659c81a8..fac76f4e 100644 --- a/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/handler/NettySocketBackendHandler.java +++ b/wu-lazy-cloud-heartbeat-protocol-proxy/src/main/java/org/framework/lazy/cloud/network/heartbeat/protocol/handler/NettySocketBackendHandler.java @@ -83,6 +83,7 @@ public class NettySocketBackendHandler extends SimpleChannelInboundHandler