2016-11-18 3 views
0

, поэтому изначально я хотел получить доступ к файлу через HTTP GET, используя URL-адрес, например «». Мой браузер мог получить к нему доступ без каких-либо проблем, поэтому следующим шагом было вывести его из java-кода.HttpURLConnection и INetAddress с использованием имени хоста не работают, пока IPv6 отлично работает

URL url = new URL("http","myhostname",123,"path/to/file"); 
    URLConnection openConnection = url.openConnection(); 
    HttpURLConnection asHttp = (HttpURLConnection) openConnection; 
    assertEquals(200, asHttp.getResponseCode()); 

К сожалению, у меня был тайм-аут. Я обнюхивал Wireshark и не видел, чтобы запрос проходил по проводу.

Затем я попробовал точно такой же URL-адрес с адресом IPv6, и я мог видеть запрос, проходящий через провод, но сервер ответил HTTP 400, потому что ему не понравилось, что в заголовок не было написано «myhostname».

InetAddress.getByName("myhostname").isReachable(5000) не работал, но работает с IPv6. При использовании команды ping на cmd.exe я могу успешно выполнить ping с помощью «ping myhostname». У меня есть код C#, который работает также отлично при использовании «myhostname». Но почему он не работает на Java и что мне нужно сделать, чтобы он работал?

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

+0

Если вы запустите 'ping myhostname', он выполняет ping IPv4 или IPv6? Я предполагаю, что IPv6, поэтому запуск «ping -6 myhostname» даст тот же результат. Если вы запустили 'ping -4 myhostname', правильно ли он выполнил ping IPv4? – Andreas

+0

Если ваш DNS возвращает оба адреса IPv4 и IPv6, но адрес IPv4 не работает, исправьте DNS, потому что Java будет * по умолчанию * использовать IPv4-адрес. Браузеры и программы на C#, вероятно, используют IPv6-адрес по умолчанию. Не важно, какой из них вы используете, потому что, если DNS возвращает оба, они должны работать. * Обход проблемы: * Скажите Java, чтобы использовать адрес IPv6. См.: [Java - Как я могу предпочесть IPv6?] (Http://stackoverflow.com/q/19314241/5221149) – Andreas

+0

@Andreas Да, ping myhostname' ping IPv6. Я уже потерпел неудачу с попыткой «System.setProperty» («java.net.preferIPv6Addresses», «true»); «... я не совсем уверен, был ли это еще тайм-аут или другое исключение. Я перепроверяю это позже. Я просто прочитал, что есть «пуленепробиваемая» -версия с использованием jvm-аргументов, нужно также проверить это. Тем не менее, это было бы обходным путем - как вы сказали, - так что исправление DNS - как бы это ни работает, похоже, сейчас сосредоточено. Спасибо. – Bastian

ответ

1

Ну, я мог бы решить мою проблему:

Как @Andreas предложил я попытался ping -4 myhostname и IPv4-адрес был разрешен, но пинг тайм-аут. Я решил проблему, отредактировав файл-хост в C:\Windows\System32\drivers\etc и добавив строку 1234::1234:1234:1234:1234%2 myhostname. Я проверил с ping -4 myhostname, но теперь он не разрешил адрес, а ping myhostname отлично работает с использованием IPv6. Мой Java-код работал совершенно сразу.

Я также повторил с использованием System.setProperty("java.net.preferIPv6Addresses", "true");, и он сработал из простого метода main(), но он не работал с JUnit-Test.

Смежные вопросы