| | |
| | | package com.ard.tianyu.netty.handler; |
| | | |
| | | import com.ard.tianyu.domain.cache.TyTcpServerCache; |
| | | import com.ard.tianyu.netty.TyNettyTcpClient; |
| | | import com.ard.tianyu.netty.command.BaseCommand; |
| | | import com.ard.tianyu.netty.command.HeartbeatCommand; |
| | | import com.ard.tianyu.netty.command.BaseCmd; |
| | | import com.ard.tianyu.service.ITyService; |
| | | import io.netty.channel.ChannelHandler; |
| | | import io.netty.channel.ChannelHandlerContext; |
| | |
| | | import io.netty.handler.timeout.IdleState; |
| | | import io.netty.handler.timeout.IdleStateEvent; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.net.InetSocketAddress; |
| | | import java.util.concurrent.TimeUnit; |
| | |
| | | @Component |
| | | @Slf4j |
| | | @ChannelHandler.Sharable |
| | | public class ClientHandler extends SimpleChannelInboundHandler<BaseCommand> { |
| | | public class ClientHandler extends SimpleChannelInboundHandler<BaseCmd> { |
| | | |
| | | @Autowired |
| | | ITyService tyService; |
| | | @Resource |
| | | private ITyService tyService; |
| | | |
| | | @Resource |
| | | private TyNettyTcpClient tyNettyTcpClient; |
| | | |
| | | @Override |
| | | public void channelRead0(ChannelHandlerContext ctx, BaseCommand command){ |
| | | public void channelRead0(ChannelHandlerContext ctx, BaseCmd command) { |
| | | InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress(); |
| | | String host = ipSocket.getHostString(); |
| | | int port = ipSocket.getPort(); |
| | | //tyService.processMessage(host + "/" + port, msg); |
| | | tyService.processReplyMessage(host + ":" + port, command); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { |
| | | cause.printStackTrace(); |
| | | ctx.close(); |
| | | log.error("发生异常: ", cause); // 使用日志记录异常 |
| | | // ctx.close(); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (event.state() == IdleState.READER_IDLE) { |
| | | log.info("客户端读超时"); |
| | | } else if (event.state() == IdleState.WRITER_IDLE) { |
| | | // HeartbeatCommand msg = new HeartbeatCommand(System.currentTimeMillis()); |
| | | // log.info("发送⼼跳!");//1652345657305 1652345707631 |
| | | // ctx.writeAndFlush(msg); |
| | | // log.info("写空闲发送⼼跳!"); |
| | | // HeartbeatCommand msg = new HeartbeatCommand(System.currentTimeMillis()); |
| | | //ctx.writeAndFlush(msg); |
| | | } else if (event.state() == IdleState.ALL_IDLE) { |
| | | log.info("客户端所有操作超时"); |
| | | } |
| | |
| | | InetSocketAddress ipSocket = (InetSocketAddress) ctx.channel().remoteAddress(); |
| | | int port = ipSocket.getPort(); |
| | | String host = ipSocket.getHostString(); |
| | | log.error("与天宇设备" + host + ":" + port + "连接断开!"); |
| | | ctx.channel().eventLoop().schedule(new Runnable() { |
| | | @Override |
| | | public void run() { |
| | | log.error("服务端链接不上,开始重连操作..."); |
| | | try { |
| | | tyNettyTcpClient.initOneConnection(host, port); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | log.error("与天宇服务{}:{}连接断开!", host, port); |
| | | TyTcpServerCache.putTcpServerCache(host + ":" + port, false); |
| | | ctx.channel().eventLoop().schedule(() -> { |
| | | log.error("天宇服务端链接不上,开始重连操作..."); |
| | | try { |
| | | tyNettyTcpClient.initConnection(host, port); |
| | | } catch (Exception e) { |
| | | log.error("天宇服务端连接异常: {}", e.getMessage()); |
| | | } |
| | | }, 5, TimeUnit.SECONDS); |
| | | |
| | | super.channelInactive(ctx); |
| | | } |
| | | |
| | | } |