0

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

请求 wss://xxx 失败并出现异常:io.ktor.network.sockets.ConnectTimeoutException:连接超时已过期 [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 客户端版本为 1.6.7。

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

提前致谢!

4

1 回答 1

0

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

截至发稿之日,目前还没有针对 Ktor 的解决方案,但 OkHttp 能够解决这个问题。

于 2022-02-24T11:36:57.150 回答