在特定网络上重定向OkHttp3请求

时间:2018-01-12 15:09:44

标签: android networking okhttp3 okhttp

当我在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和查找方法中放了几个断点,它们似乎使用他们应该使用的网络对象正常工作。 知道如何在这个问题上修复或进展吗?

1 个答案:

答案 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网络。