#android #retrofit #okhttp
#Android #модернизация #okhttp
Вопрос:
У меня возникли проблемы с моим приложением при выполнении запросов REST с использованием retrofit okhttp в сетях ipv6. Время отклика при подключении к сетям ipv6 кажется очень высоким (примерно 10 секунд на каждый запрос). Можете ли вы сказать мне, есть ли какой-либо способ ограничить приложение, чтобы оно отдавало приоритет сетям ipv4? Я знаю, что это может повлиять на удобство использования приложения, но приложение предназначено для использования в более ограниченных средах, оно не для широкой публики.
Ответ №1:
Вы можете настроить пользовательскую реализацию Dns, которая просто фильтрует результаты Dns.SYSTEM по IPv4.
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 для объявления.