当我在WiFi上超时时,我尝试重定向移动连接上的流量。为了执行该操作,我使用NetworkRequest
并询问TRANSPORT_CELLULAR
,它为我提供了一个Network
对象,我尝试将其与OkHttp3一起使用。
我的初始(没有绑定到网络)OkHttp实例实例化如下:
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
.sslSocketFactory(mSSLSocketFactory, new MyTrustManager())
.dns(mNetworkDns)
.hostnameVerifier(new MyHostnameVerifier());
使用我的SSLSocketFactory createSocket
方法:
@Override
public Socket createSocket(Socket socket, String s, int i, boolean flag) throws IOException {
if (mNetwork != null) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
Socket bindedSocket = mNetwork.getSocketFactory().createSocket(s, i);
return mFactory.createSocket(bindedSocket, s, i, flag);
}
}
return mFactory.createSocket(socket, s, i, flag);
}
和Dns查找:
@Override
public List<InetAddress> lookup(String hostname) throws UnknownHostException {
if (mNetwork != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
List<InetAddress> addresses = Arrays.asList(mNetwork.getAllByName(hostname));
Log.i("NetworkDns", "List : " + addresses);
return addresses;
}
return SYSTEM.lookup(hostname);
}
如果未设置网络,则表明它正在运行。 但是,如果有一刻我将一个Network对象传递给我的SSLSocketFactory和我的DNS,我只有超时:D / OkHttp:&lt; - HTTP FAILED:java.net.SocketTimeoutException:connect timed out
我在createSocket和查找方法中放了几个断点,它们似乎使用他们应该使用的网络对象正常工作。 知道如何在这个问题上修复或进展吗?
答案 0 :(得分:1)
好的,似乎不应该以这种方式使用来自createSocket
的{{1}}。我终于通过向我的SSLSocketFactory
实例添加了绑定到我的网络的标准SocketFactory
来实现它。
OkHttpClient
最后我不会覆盖OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
.socketFactory(myNetwork.getSocketFactory())
.sslSocketFactory(mSSLSocketFactory, new MyTrustManager())
.dns(mNetworkDns)
.hostnameVerifier(new MyHostnameVerifier());
中的createSocket方法。这样套接字就可以绑定到我的网络,甚至是SSL网络。