diff --git a/app/src/main/java/com/casic/app/safetreecontroller/tcp/TcpClient.kt b/app/src/main/java/com/casic/app/safetreecontroller/tcp/TcpClient.kt index ef0b7e6..47f8442 100644 --- a/app/src/main/java/com/casic/app/safetreecontroller/tcp/TcpClient.kt +++ b/app/src/main/java/com/casic/app/safetreecontroller/tcp/TcpClient.kt @@ -17,6 +17,7 @@ import io.netty.handler.codec.bytes.ByteArrayDecoder import io.netty.handler.codec.bytes.ByteArrayEncoder import io.netty.handler.timeout.IdleStateHandler +import java.net.InetSocketAddress import java.util.concurrent.TimeUnit @@ -32,6 +33,7 @@ private var loopGroup: EventLoopGroup = NioEventLoopGroup() private var channel: Channel? = null private var isRunning = false + private var retryTimes = 0 fun start() { if (isRunning) { @@ -52,23 +54,25 @@ override fun initChannel(ch: SocketChannel?) { ch?.apply { pipeline() - .addLast(IdleStateHandler(60, 10, 0)) .addLast(ByteArrayDecoder()) .addLast(ByteArrayEncoder()) + .addLast(IdleStateHandler(60, 10, 0)) .addLast(object : SimpleChannelInboundHandler() { - override fun channelActive(ctx: ChannelHandlerContext?) { - Log.d(kTag, "channelActive: ") + override fun channelActive(ctx: ChannelHandlerContext) { + val address = ctx.channel().remoteAddress() as InetSocketAddress + Log.d(kTag, "${address.address.hostAddress} 已连接") listener.onConnected() } - override fun channelInactive(ctx: ChannelHandlerContext?) { - Log.d(kTag, "channelInactive: ") + override fun channelInactive(ctx: ChannelHandlerContext) { + val address = ctx.channel().remoteAddress() as InetSocketAddress + Log.d(kTag, "${address.address.hostAddress} 已断开") listener.onDisconnected() reconnect() } override fun channelRead0( - ctx: ChannelHandlerContext?, msg: ByteArray? + ctx: ChannelHandlerContext, msg: ByteArray? ) { listener.onMessageReceived(msg) } @@ -89,7 +93,6 @@ if (channel != null && channel!!.isActive) { return } - Thread { try { val channelFuture = bootstrap.connect(host, port) @@ -97,22 +100,23 @@ override fun operationComplete(channelFuture: ChannelFuture) { if (channelFuture.isSuccess) { isRunning = true + retryTimes = 0 channel = channelFuture.channel() } } }).sync() - // 等待连接关闭 channelFuture.channel().closeFuture().sync() } catch (e: Exception) { - Log.d(kTag, "connect: ${e.message}") + Log.d(kTag, "连接失败: ${e.message}") reconnect() } }.start() } private fun reconnect() { + retryTimes++ + Log.d(kTag, "开始第 $retryTimes 次重连") loopGroup.schedule({ connect() }, reconnectDelay, TimeUnit.SECONDS) - Log.d(kTag, "Reconnecting: ") } fun stop() {