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

发布于 2025-01-09 16:25:38 字数 1157 浏览 0 评论 0原文

我正在使用 Ktor 客户端在 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 上失败。期待有了解更多的人。

提前致谢!

I am using Ktor Client to establish a websocket connection in an Android App.
The connection works fine on the emulator and even on a smartphone when using mobile data.
The problem starts occurring when using wifi. When wifi is enabled on a smartphone, normal HTTP requests over Ktor Client keep working, but the websocket connection fails with a timeout exception:

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

My code is as following:

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")
    }
}

My manifest contains internet permissions:

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

The problem was tested on multiple devices in multiple wifi networks.
The Ktor Client version for all components is 1.6.7.

I really have no idea why the websocket only fails on wifi. Looking forward to someone that knows more.

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

与他有关 2025-01-16 16:25:38

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

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

The problem seems to be DNS related. I have opened a bugreport on youtrack where I describe the problem and the solution: https://youtrack.jetbrains.com/issue/KTOR-3932

As of the day of writing, there is currently no solution for Ktor, but OkHttp is able to solve this problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文