我一直在尝试在 Android 上使用带有 wss://
URL 的 OkHttp WebSockets
但无济于事。当我传递一个带有 wss://
方案的 URL 时,它被替换为 https://
。然后,它当然会失败。
有没有人对如何进行有任何建议。那里有更好的 websocket 库吗?这是我正在处理的服务。
class WebsocketService(private val okHttpClient: OkHttpClient) :
WebSocketListener() {
private lateinit var webSocket: WebSocket
private lateinit var serverListener: ServerListener
fun connect(listener: ServerListener) {
this.serverListener = listener
val request = Request.Builder().url(SOCKET_URL).build()
okHttpClient.newWebSocket(request, this)
}
override fun onOpen(webSocket: WebSocket?, response: Response?) {
super.onOpen(webSocket, response)
Timber.e("On Open %s", response.toString())
}
override fun onFailure(webSocket: WebSocket?, t: Throwable?, response: Response?) {
super.onFailure(webSocket, t, response)
Timber.e("On Failure %s", response.toString())
}
override fun onClosing(webSocket: WebSocket?, code: Int, reason: String?) {
super.onClosing(webSocket, code, reason)
Timber.e("On Closing %s", reason)
}
override fun onMessage(webSocket: WebSocket?, text: String?) {
super.onMessage(webSocket, text)
Timber.e("On Message %s", text)
}
override fun onMessage(webSocket: WebSocket?, bytes: ByteString?) {
super.onMessage(webSocket, bytes)
Timber.e("On Message Bytes %s", bytes)
}
override fun onClosed(webSocket: WebSocket?, code: Int, reason: String?) {
super.onClosed(webSocket, code, reason)
Timber.e("On Closed %s", reason)
}
enum class ConnectionStatus {
DISCONNECTED,
CONNECTED
}
interface ServerListener {
fun onNewMessage(message: String)
fun onStatusChange(status: ConnectionStatus)
}
}
最佳答案
OkHttp 用于建模 URL 的 HttpUrl 类仅建模 http:
和 https:
方案。但这不太可能是您的网络套接字失败的原因。方案更改旨在作为 OkHttp 内部的实现细节,不应影响行为。
关于android - 为什么 OkHttp 会默默地替换掉 ws ://or wss://schemes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51303725/