我试图从WiFi或移动数据到达我的服务器,具体取决于正在接听的接口。用例如下: - WiFi始终开启。 - 如果服务器没有通过WiFi响应(例如,因为没有互联网连接),那么我将未来的请求重定向到蜂窝数据。 - 当通过WiFi返回连接时,我将下一个请求重定向到WiFi。
为实现这一目标,我想将ConnectivityManager与TRANSPORT_CELLULAR或TRANSPORT_WIFI一起使用。然后它返回一个我可以使用的网络对象。
之后我计划将socketFactory从Network类传递给OkHttpClient。
OkHttpClient client = new OkHttpClient.Builder()
.socketFactory(network.getSocketFactory())
.build();
问题:服务器使用https连接。所以我使用socketSSLFactory构建OkHttpClient,它是使用SSLContext及其方法getSocketFactory构建的。
所以问题如下:如何将OkHttpClient绑定到网络和SSL套接字工厂?
答案 0 :(得分:0)
好的,所以我终于找到了如何执行该操作。 它需要同时使用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
上执行名称解析。 (cf Perform network-specific host name resolutions using Network.getAllByName)