概要
`使用netty实现一个简单的tcp客户端
整体架构流程
最近要写一个关于tcp协议连接硬件的 ,自己没事研究了一下
初学netty代码如下
技术细节
客户端代码
public class BootNettyTcpClient {
private ExecutorService executorService = Executors.newCachedThreadPool();
public void connectMultiple(List<TcpConfig> tcpConfigs) {
for (TcpConfig tcpConfig : tcpConfigs) {
executorService.execute(() -> connect(tcpConfig));
}
}
public boolean connect(TcpConfig tcpConfig) {
AtomicBoolean isSuccess = new AtomicBoolean(false);
EventLoopGroup group = EventLoopGroupPool.getInstance().getEventLoopGroup(NettyConstants.TcpLoopGroupPooL);
Channel channel = ChannelPool.getChannel(tcpConfig.getIp() + tcpConfig.getPort());
BootNettyTcpChannelInitializer<SocketChannel> initializer = new BootNettyTcpChannelInitializer<>();
initializer.setTcpConfig(tcpConfig);
if (channel == null || !channel.isActive()) {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.option(ChannelOption.TCP_NODELAY, true)
.handler(initializer);
try {
ChannelFuture f = bootstrap.connect(tcpConfig.getIp(), tcpConfig.getPort()).sync();
if (f.isSuccess()) {
channel = f.channel();
ChannelPool.addChannel(tcpConfig.getIdWithPort(), channel);
isSuccess.set(true);
//连接成功发送上线通知
} else {
// 连接失败处理
if (!waitBeforeRetry(tcpConfig)) {
isSuccess.set(false);
f.channel().closeFuture().sync();
if (ChannelPool.containChannel(tcpConfig.getIdWithPort())) {
ChannelPool.removeChannel(tcpConfig.getIdWithPort());
}
}
}
} catch (Exception e) {
log.error("连接异常:" + e.getMessage());
boolean waitBeforeRetry = waitBeforeRetry(tcpConfig);
if (waitBeforeRetry){