使用Network.getAllByName执行特定于网络的主机名解析

时间:2018-01-10 17:36:10

标签: android networking android-connectivitymanager

在ConnectivityManager文档的bindProcessToNetwork javadoc中,有以下注释:

  

使用由...创建的单独绑定套接字   Network.getSocketFactory()。createSocket()和执行   通过Network.getAllByName进行网络特定的主机名解析   首选调用bindProcessToNetwork。

在OkHttp中,有setSocketFactory来满足评论的第一部分,但我不知道如何/在哪里使用Network.getAllByName来执行主机名解析。

知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

好的,所以我终于找到了如何执行该操作。 正如我在我的问题中所说,我使用OkHttpClient来设置我的socketfactory。使用dns进行名称解析时也是如此(它需要OkHttp3)。

OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder()
    .socketFactory(network.getSocketFactory())
    .dns(NetworkDns.getInstance())

我的NetworkDns类正在寻找类似的东西

public class NetworkDns implements Dns {

  private static NetworkDns sInstance;
  private Network mNetwork;

  public static NetworkDns getInstance() {
    if (sInstance == null) {
      sInstance = new NetworkDns();
    }
    return sInstance;
  }

  public void setNetwork(Network network) {
    mNetwork = network;
  }

  @Override
  public List<InetAddress> lookup(String hostname) throws UnknownHostException {
    if (mNetwork != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      return Arrays.asList(mNetwork.getAllByName(hostname));
    }
    return SYSTEM.lookup(hostname);
  }

  private NetworkDns() {
  }
}

这样,当network不为null时,它将在给定网络上执行主机名解析。