diff --git a/app/src/main/java/com/futo/platformplayer/Extensions_Network.kt b/app/src/main/java/com/futo/platformplayer/Extensions_Network.kt index 4ea143b6..0ec735da 100644 --- a/app/src/main/java/com/futo/platformplayer/Extensions_Network.kt +++ b/app/src/main/java/com/futo/platformplayer/Extensions_Network.kt @@ -9,7 +9,6 @@ import java.net.InetAddress import java.net.InetSocketAddress import java.net.Socket import java.nio.ByteBuffer -import java.nio.charset.Charset private const val IPV4_PART_COUNT = 4; @@ -216,13 +215,15 @@ private fun ByteArray.toInetAddress(): InetAddress { } fun getConnectedSocket(addresses: List, port: Int): Socket? { + val timeout = 5000 + if (addresses.isEmpty()) { return null; } if (addresses.size == 1) { try { - return Socket(addresses[0], port); + return Socket().apply { this.connect(InetSocketAddress(addresses[0], port), timeout) }; } catch (e: Throwable) { //Ignored. } @@ -249,7 +250,7 @@ fun getConnectedSocket(addresses: List, port: Int): Socket? { } } - socket.connect(InetSocketAddress(address, port)); + socket.connect(InetSocketAddress(address, port), timeout); synchronized(syncObject) { if (connectedSocket == null) { diff --git a/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt index eeee0dd3..c5743dd6 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/ChomecastCastingDevice.kt @@ -307,7 +307,7 @@ class ChromecastCastingDevice : CastingDevice { try { val connectedSocket = getConnectedSocket(adrs.toList(), port); if (connectedSocket == null) { - Thread.sleep(3000); + Thread.sleep(1000); continue; } @@ -347,7 +347,7 @@ class ChromecastCastingDevice : CastingDevice { Logger.i(TAG, "Failed to connect to Chromecast.", e); connectionState = CastConnectionState.CONNECTING; - Thread.sleep(3000); + Thread.sleep(1000); continue; } @@ -363,7 +363,7 @@ class ChromecastCastingDevice : CastingDevice { _socket?.close(); connectionState = CastConnectionState.CONNECTING; - Thread.sleep(3000); + Thread.sleep(1000); continue; } @@ -415,7 +415,7 @@ class ChromecastCastingDevice : CastingDevice { Logger.i(TAG, "Socket disconnected."); connectionState = CastConnectionState.CONNECTING; - Thread.sleep(3000); + Thread.sleep(1000); } Logger.i(TAG, "Stopped connection loop."); diff --git a/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt b/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt index a75f0c7c..721df17e 100644 --- a/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt +++ b/app/src/main/java/com/futo/platformplayer/casting/FCastCastingDevice.kt @@ -32,6 +32,7 @@ import java.io.DataOutputStream import java.io.IOException import java.math.BigInteger import java.net.InetAddress +import java.net.InetSocketAddress import java.net.Socket import java.security.KeyFactory import java.security.KeyPair @@ -241,29 +242,40 @@ class FCastCastingDevice : CastingDevice { val thread = _thread if (thread == null || !thread.isAlive) { - Log.i(TAG, "Restarting thread because the thread has died") + Log.i(TAG, "(Re)starting thread because the thread has died") + + _scopeIO?.let { + it.cancel() + Logger.i(TAG, "Cancelled previous scopeIO because a new one is starting.") + } - _scopeIO?.cancel(); - Logger.i(TAG, "Cancelled previous scopeIO because a new one is starting.") _scopeIO = CoroutineScope(Dispatchers.IO); _thread = Thread { connectionState = CastConnectionState.CONNECTING; + Log.i(TAG, "Connection thread started.") + var connectedSocket: Socket? = null while (_scopeIO?.isActive == true) { try { - val connectedSocket = getConnectedSocket(adrs.toList(), port); - if (connectedSocket == null) { - Thread.sleep(3000); + Log.i(TAG, "getConnectedSocket.") + + val resultSocket = getConnectedSocket(adrs.toList(), port); + + if (resultSocket == null) { + Log.i(TAG, "Connection failed, waiting 1 seconds.") + Thread.sleep(1000); continue; } - usedRemoteAddress = connectedSocket.inetAddress; - localAddress = connectedSocket.localAddress; - connectedSocket.close(); + Log.i(TAG, "Connection succeeded.") + + connectedSocket = resultSocket + usedRemoteAddress = connectedSocket.inetAddress + localAddress = connectedSocket.localAddress break; } catch (e: Throwable) { - Logger.w(ChromecastCastingDevice.TAG, "Failed to get setup initial connection to FastCast device.", e) + Logger.w(TAG, "Failed to get setup initial connection to FastCast device.", e) } } @@ -273,7 +285,14 @@ class FCastCastingDevice : CastingDevice { connectionState = CastConnectionState.CONNECTING; try { - _socket = Socket(usedRemoteAddress, port); + if (connectedSocket != null) { + Logger.i(TAG, "Using connected socket."); + _socket = connectedSocket + connectedSocket = null + } else { + Logger.i(TAG, "Using new socket."); + _socket = Socket().apply { this.connect(InetSocketAddress(usedRemoteAddress, port), 5000) }; + } Logger.i(TAG, "Successfully connected to FastCast at $usedRemoteAddress:$port"); _outputStream = DataOutputStream(_socket?.outputStream); @@ -283,7 +302,7 @@ class FCastCastingDevice : CastingDevice { Logger.i(TAG, "Failed to connect to FastCast.", e); connectionState = CastConnectionState.CONNECTING; - Thread.sleep(3000); + Thread.sleep(1000); continue; } @@ -343,7 +362,7 @@ class FCastCastingDevice : CastingDevice { } connectionState = CastConnectionState.CONNECTING; - Thread.sleep(3000); + Thread.sleep(1000); } Logger.i(TAG, "Stopped connection loop.");