将 Network SocketFactory 与 SSL 结合使用

Use Network SocketFactory with SSL

我正在尝试从 WiFi 或移动数据访问我的服务器,具体取决于哪个接口正在应答。用例如下: - WiFi 始终开启。 - 如果服务器没有通过 WiFi 响应(例如因为没有互联网连接),那么我会将以后的请求重定向到蜂窝数据。 - 当连接通过 WiFi 恢复时,我将下一个请求重定向到 WiFi。

为此,我想将 ConnectivityManager 与 TRANSPORT_CELLULAR 或 TRANSPORT_WIFI 一起使用。然后它 returns 一个我可以使用的网络对象。

之后我计划将 socketFactory 从网络 class 传递到 OkHttpClient。

OkHttpClient client = new OkHttpClient.Builder()
        .socketFactory(network.getSocketFactory())
        .build();

问题:服务器使用 https 连接。所以我正在使用 socketSSLFactory 构建 OkHttpClient,它是使用 SSLContext 及其方法 getSocketFactory 构建的。

所以问题如下:如何将 OkHttpClient 绑定到网络和 SSL 套接字工厂?

好的,所以我终于找到了如何执行它。 它需要同时使用 OkHttp 构建器的 socketFactory 和 SSLSocketFactory。

OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder()
    .sslSocketFactory(new MySSLSocketFactory(), new MyTrustManager())
    .socketFactory(network.getSocketFactory())
    .dns(new NetworkDns())
    .hostnameVerifier(new MyHostnameVerifier());

具体来说,MySSLSocketFactory 没有绑定到我的网络对象。我不需要重写其中的 createSocket 方法。我只是将 network 对象的套接字工厂传递给 OkHttp 构建器。

不要忘记重写 dns 以及对 network 执行所需的名称解析。 (比照)