为什么 OkHttp 会默默替换 ws:// 或 wss:// 方案?

and*_*ing 5 android websocket okhttp

我一直在尝试使用OkHttp WebSocketswss://Android上的URL无济于事。当我传递一个带有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)
}
}
Run Code Online (Sandbox Code Playgroud)

Jes*_*son 0

OkHttp 用于建模 URL 的 HttpUrl 类仅建模http:https:方案进行建模。但这不太可能是您的网络套接字失败的原因。方案更改旨在作为 OkHttp 内部的实现细节,并且\xe2\x80\x99不会影响行为。

\n

  • 如果服务器对 https 和 wss 请求的响应不同怎么办?我正在连接到一个服务器,其中任何 https 流量都会被重定向,就好像它是普通的 HTML 网页请求一样,因此保留该方案至关重要。 (2认同)