如何使用 Kotlin 查找多台服务器中最先响应的服务器的 IP 地址

问题描述 投票:0回答:1

我正在开发一个去中心化网络 Android 应用程序。有多个服务器,我需要找到对网络调用响应最快的服务器。这看起来很容易,但出奇的困难。感谢任何使用 Kotlin 解决问题的帮助。

Gemini 提供的当前代码,不幸的是无法返回@coroutineScope。这是编译器不允许的。 return@await 是允许的,但它不会脱离协程作用域,因此所有协程都会被等待。可能需要 10 秒。

suspend fun getAccessibleIP(ipList: List<String>): String? = coroutineScope {
    val deferreds = ipList.filter { isValidPublicIpAddress(it) }.map { ip ->
        Timber.tag("getAccessibleIP").d("trying $ip")
        async {
            try {
                HproseInstance.isAccessible(ip)
            } catch (e: Exception) {
                null
            }
        }
    }
    try {
        withTimeoutOrNull(2000L) {
            select<String?> {
                deferreds.forEach { deferred ->
                    deferred.onAwait { res ->
                        if (res != null) {
                            // Cancel remaining deferred values and return the result
                            deferreds.forEach { it.cancel() }
                            return@coroutineScope res // Exit coroutineScope and return res
                        } else {
                            null
                        }
                    }
                }
            }
        }
    } finally {
        // Ensure all coroutines are cancelled if the function exits
        deferreds.forEach { it.cancel() }
    }
}
kotlin asynchronous ip coroutinescope
1个回答
0
投票

最简单的惯用语是

return channelFlow {
  ipList.filter { isValidPublicIpAddress(it) }.map { ip ->
        Timber.tag("getAccessibleIP").d("trying $ip")
        launch {
            try {
              send(HproseInstance.isAccessible(ip))
            } catch (e: Exception) {
              // do nothing, I guess?
            }
        }
    }
}.firstOrNull()
© www.soinside.com 2019 - 2024. All rights reserved.