使用带有SSL的Network SocketFactory

时间:2017-12-11 18:50:13

标签: android sockets ssl networking okhttp3

我试图从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套接字工厂?

1 个答案:

答案 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