我正在使用Ktor客户端在Android应用中建立WebSocket连接。当使用移动的数据时,连接在模拟器上甚至在智能手机上都能正常工作。当使用wifi时,问题开始出现。当智能手机上启用wifi时,通过Ktor客户端的正常HTTP请求继续工作,但websocket连接失败,并出现超时异常:
请求wss://xxx失败,出现异常:连接超时异常:连接超时已过期[url=wss://xxx,connect_timeout=未知毫秒]
我的代码如下:
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")
}
}
我的清单包含Internet权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
该问题在多个WiFi网络中的多个设备上进行了测试。所有组件的Ktor客户端版本均为1. 6. 7。
我真的不知道为什么WebSocket只在WiFi上失败。期待有人知道更多。
提前感谢!
1条答案
按热度按时间toe950271#
这个问题似乎与DNS有关。我已经在youtrack上打开了一个bugreport,在那里我描述了这个问题和解决方案:https://youtrack.jetbrains.com/issue/KTOR-3932
截至本文撰写之日,目前还没有针对Ktor的解决方案,但OkHttp能够解决这个问题。