package com.ard.utils.netty.tcp; import com.ard.alarm.radar.domain.ArdEquipRadar; import com.ard.alarm.radar.service.IArdEquipRadarService; import com.ard.utils.netty.config.NettyTcpConfiguration; 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.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.nio.channels.SocketChannel; import java.util.List; @Slf4j(topic = "netty") @Component public class BootNettyClient { @Resource IArdEquipRadarService ardEquipRadarService; @Resource NettyTcpConfiguration nettyTcpConfig; static Integer waitTimes = 1; static EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); /** * 初始化Bootstrap */ public static final Bootstrap getBootstrap(EventLoopGroup group) { if (null == group) { group = eventLoopGroup; } Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) .option(ChannelOption.SO_KEEPALIVE, true) .handler(new BootNettyChannelInitializer()); return bootstrap; } public void connect(ArdEquipRadar radar) throws Exception { String host = radar.getIp(); int port=radar.getPort(); log.debug("正在进行连接:【" + host+":"+port+"】"); eventLoopGroup.shutdownGracefully(); eventLoopGroup = new NioEventLoopGroup(); Bootstrap bootstrap = getBootstrap(null); try { bootstrap.remoteAddress(host, port); // 异步连接tcp服务端 ChannelFuture future = bootstrap.connect().addListener((ChannelFuture futureListener) -> { final EventLoop eventLoop = futureListener.channel().eventLoop(); if (futureListener.isSuccess()) { BootNettyClientChannel bootNettyClientChannel = new BootNettyClientChannel(); Channel channel = futureListener.channel(); String id = futureListener.channel().id().toString(); // String id = host; bootNettyClientChannel.setChannel(channel); bootNettyClientChannel.setCode("clientId:" + id); BootNettyClientChannelCache.save("clientId:" + id, bootNettyClientChannel); BootNettyClientChannelCache.save(host+":"+port,radar); log.debug("netty client start success=" + id); } else { // System.err.println("连接失败," + waitTimes.toString() + "秒后重新连接:" + host); try { Thread.sleep(waitTimes * 1000); } finally { connect(radar); } } }); future.channel().closeFuture().sync(); } catch (Exception e) { System.err.println("连接异常," + waitTimes.toString() + "秒后重新连接:" + host); try { Thread.sleep(waitTimes * 1000); } finally { connect(radar); } e.printStackTrace(); } finally { /** * 退出,释放资源 */ eventLoopGroup.shutdownGracefully().sync(); } } /** * 初始化方法 */ public void run(ApplicationArguments args) { if (!nettyTcpConfig.getEnabled()) { return; } List ardEquipRadars = ardEquipRadarService.selectArdEquipRadarList(new ArdEquipRadar()); for (ArdEquipRadar ardEquipRadar : ardEquipRadars) { String host = ardEquipRadar.getIp(); Integer port = Integer.valueOf(ardEquipRadar.getPort()); log.debug("TCP client try to connect radar【:" + host + ":" + port+"】"); BootNettyClientThread thread = new BootNettyClientThread(ardEquipRadar); thread.start(); } } }