Как мне заставить мое приложение для Android использовать ipv4 вместо ipv6?

#android #retrofit #okhttp

#Android #модернизация #okhttp

Вопрос:

У меня возникли проблемы с моим приложением при выполнении запросов REST с использованием retrofit okhttp в сетях ipv6. Время отклика при подключении к сетям ipv6 кажется очень высоким (примерно 10 секунд на каждый запрос). Можете ли вы сказать мне, есть ли какой-либо способ ограничить приложение, чтобы оно отдавало приоритет сетям ipv4? Я знаю, что это может повлиять на удобство использования приложения, но приложение предназначено для использования в более ограниченных средах, оно не для широкой публики.

Ответ №1:

Вы можете настроить пользовательскую реализацию Dns, которая просто фильтрует результаты Dns.SYSTEM по IPv4.

https://github.com/yschimke/okurl/blob/master/src/main/kotlin/com/baulsupp/okurl/network/DnsSelector.kt

 class DnsSelector() : Dns {
  override fun lookup(hostname: String): List<InetAddress> {
    return Dns.SYSTEM.lookup(hostname).filter { Inet4Address::class.java.isInstance(it) }
  }
}
  

затем установите его

   val client = OkHttpClient.Builder().dns(DnsSelector()).build()
  

Комментарии:

1. Похожие: github.com/square/okhttp/issues/506#issuecomment-765899011

2. на самом деле гораздо более безопасным способом сделать это было бы отсортировать его по адресам IPV4, за которыми следуют адреса IPV6, чтобы вы получили добро без проблем. ` класс DnsSelector(): Dns { переопределить поиск (имя хоста: строка): Список<InetAddress> { вернуть Dns.SYSTEM.lookup(имя хоста).sortedBy { Inet6Address::class.java.isInstance(it) } } } `

Ответ №2:

OkHttp 5 (альфа) поддерживает HappyEyeballs. По умолчанию используется alpha11. Это должно корректно обрабатывать сочетание IPv4 и IPv6 без изменений кода.

См . https://twitter.com/jessewilson/status/1495780761819037697?lang=en-GB для объявления.