使用 wifi 时 Ktor 客户端 websocket 连接超时

Ktor client websocket connection timeout when using wifi

我正在使用 Ktor 客户端在 Android 应用程序中建立 websocket 连接。 连接在模拟器上运行良好,甚至在使用移动数据的智能手机上也能正常运行。 使用 wifi 时开始出现问题。在智能手机上启用 wifi 时,通过 Ktor Client 的正常 HTTP 请求继续工作,但 websocket 连接失败并出现超时异常:

REQUEST wss://xxx failed with exception: io.ktor.network.sockets.ConnectTimeoutException: Connect timeout has expired [url=wss://xxx, connect_timeout=unknown ms]

我的代码如下:

override suspend fun initSession(userId: Int): Resource<Unit> {
    return try {
        socket = client.webSocketSession {
            url(CallSocketService.Endpoints.Base.url + "/$userId")
        }
        if(socket?.isActive == true) {
            Resource.Success(Unit)
        } else Resource.Error("Couldn't establish connection")
    } catch (e: Exception) {
        e.printStackTrace()
        Resource.Error(e.localizedMessage ?: "Unknown Error")
    }
}

我的清单包含互联网权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

该问题已在多个 wifi 网络中的多个设备上进行了测试。 所有组件的 Ktor Client 版本为 1.6.7.

我真的不知道为什么 websocket 只在 wifi 上失败。期待知道更多的人。

提前致谢!

问题似乎与 DNS 有关。我在 youtrack 上打开了一个错误报告,其中描述了问题和解决方案:https://youtrack.jetbrains.com/issue/KTOR-3932

截至撰写本文之日,Ktor 目前还没有解决方案,但 OkHttp 能够解决这个问题。