URL равняется и проверяет доступ в интернет - PullRequest
3 голосов
/ 24 мая 2010

Вкл. http://java.sun.com/j2se/1.5.0/docs/api/java/net/URL.html утверждает, что:

Сравнивает этот URL на равенство с другим объектом.

Если данный объект не является URL, тогда этот метод немедленно возвращает false.

Два объекта URL равны, если они имеют тот же протокол, ссылка эквивалентные хосты, имеют одинаковый порт номер на хосте и тот же файл и фрагмент файла.

Два хоста считаются эквивалентными, если оба имени хоста могут быть преобразованы в одинаковые IP-адреса; иначе, если либо имя хоста не может быть разрешено, хост имена должны быть равны безотносительно к дело; или оба имени хоста равны нуль.

Поскольку для сравнения хостов требуется имя разрешение, эта операция операция блокировки.

Примечание: определенное поведение для равных как известно, несовместимы с виртуальный хостинг в HTTP.

В соответствии с этим, равные будут работать, только если разрешение имен возможно. Поскольку я не могу быть уверен, что компьютер в данный момент имеет доступ к Интернету, должен ли я вместо этого использовать строки для хранения адресов? Кроме того, как мне пройти тестирование, если доступ доступен по запросу?

Ответы [ 3 ]

6 голосов
/ 24 мая 2010

Вы должны использовать класс java.net.URI.Метод equals работает правильно.

Что касается тестирования соединения, я бы сказал, что вам нужно попытаться открыть сокетное соединение по заданному адресу и порту.

3 голосов
/ 24 мая 2010

Я только что провел быстрый тест, сравнивая два URL-адреса с моей отключенной сетью. Метод URL.equals() дает правильный ответ, но без подключения к сети для сравнения потребовалось более двух секунд. С подключенной сетью это было намного быстрее (~ 40x). Так что производительность сравнения на компьютере без сетевого подключения может быть проблемой, но само сравнение должно работать.

(И, конечно, время может зависеть от конкретного оборудования / ОС)

2 голосов
/ 24 мая 2010

Простой ответ - использовать [java.net.URI][1] для сравнения URL, а не java.net.URL. Но это все равно даст вам более или менее буквальное сравнение URI.

Если вы хотите сделать более умную работу по сравнению URI, есть целый раздел спецификации URI на эту тему. Вещи, которые может необходимо учитывать, включают:

  • заглавные буквы <scheme> и <domain>
  • заглавные буквы escape-последовательностей
  • номера портов по умолчанию
  • ненужные escape-последовательности
  • неканонические <path> компоненты
  • значение URL <fragment> и <user-info>.

Тогда возникает проблема, связанная с тем, что разные URL-адреса могут разрешаться для одного и того же ресурса посредством постоянного или временного перенаправления или просто путем возврата идентичного содержимого. А один URL-адрес может разрешать доступ к разным ресурсам в зависимости от заголовков HTTP-запроса, IP-адреса источника, фазы луны и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...