Как создать объект URL, используя объект InetAddress в Java?

У меня есть необходимость создать объект http или https URL из адреса IPv4 (объекты String или InetAddress - любой в порядке) в Java. Я был в этом в течение 10 часов.

Попытки поразить стену описаны ниже:

  1. Попытка № 1: я попытался создать URL, собрав строку, а затем передав ее в конструктор URL.

    • В учебнике говорится, что URL может быть "protocol://host", где host - это имя хоста или IP-адрес. но создать URL-адрес, как это: URL a = new URL("http://151.101.65.69"); и открытие потока на этот URL (a) выдает ошибку HTTP 500 (Внутренняя ошибка сервера - возникла непредвиденная ситуация, когда сервер не знает, как ее обработать).
    • Что меня возмущает, так это то, что URL a = new URL("http://stackru.com"); работает.
    • На данный момент я застрял. Я понятия не имею, что изменить, или как двигаться вперед.
  2. Попытка № 2: я попытался выполнить обратный поиск по IP-адресу, используя метод "getHostName()" в классе InetAddress.

    • это должно вернуть имя хоста, выполнив обратный поиск DNS. Тем не менее, я продолжаю пробовать его для 151.101.65.69 (IP-адрес веб-сервера stackru), и поиск не удается. Под ошибками я подразумеваю, что IP-адрес возвращается как строка, а не имя хоста как строка. Я читаю документы Oracle http://docs.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html, но я не понимаю, как преодолеть "менеджер безопасности" "в документе упоминается (или если это действительно причина, по которой обратный поиск не удался).
    • Я также попытался "getCannonicalHostName()", но это тоже не сработало.
  3. Я пытаюсь выяснить, как открыть сайт, используя IP-адрес. Похоже, что мой браузер сталкивается с той же проблемой, что и мой код. Я читаю на Как получить доступ к сайту через IP-адрес, когда сайт находится на общем хосте? но у меня нет имен пользователей, так как я хочу иметь возможность открывать любой веб-сайт, для которого у пользователя есть IP-адрес. Добавление порта (например, 80), похоже, не работает; и при этом не оставляя имя пользователя пустым или используя общий "пользователь" или "гость".

Мне нужно, чтобы создать объект URL из объекта IPv4 String или InetAddress, и я застрял. Я понимаю, что опытный программист, такой как вы, может сказать, что создание URL-адресов из IP-адресов - это не то, для чего предназначены IP-адреса, или указать, что я не включаю файловую часть URL-адреса, но в данный момент это не проблема., Не могли бы вы помочь мне с моей основной задачей?

2 ответа

Решение

Следующий код работает для меня.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;

public class InetAddressMain {

    public static void main(String[] args) {
        try {
            InetAddress addr = InetAddress.getByName("172.217.4.110");

            URL url = new URL("http://"+addr.getHostAddress());
            InputStream is = url.openStream();

            InputStreamReader isReader = new InputStreamReader(is);
            BufferedReader reader = new BufferedReader(isReader);
            String line;
            while((line = reader.readLine()) != null){
                System.out.println(line);
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Выход:

Ответ, предоставленный БД, хорош. У меня был очень похожий код; но вы обнаружите, что этот код не будет работать каждый раз. Существуют IPv4-адреса, которые вы передаете в ответ на предложенный код БД, который не сможет открыть поток URL-адресов (например, IP-адрес для stackru). Я думал, что проблема была в моем кодировании, и именно на это я надеялся получить помощь по stackru. Но теперь я понимаю, что проблема заключалась в том, что я не понимал этот вопрос. Теперь я понимаю, что наличие IPv4-адреса недостаточно для открытия каждого веб-сайта в Интернете. Каждый раз, когда на сервере размещается несколько веб-сайтов, IP-адрес может использоваться для подключения к серверу, но не для одновременной идентификации веб-сайта, который мы хотим открыть / получить к нему доступ. Этот джентльмен объясняет это довольно хорошо: http://ask-leo.com/why_doesnt_accessing_a_site_by_its_ip_address_work.html

@DB спасибо, что нашли время, чтобы помочь. Очень признателен!

Другие вопросы по тегам