Как создать объект URL, используя объект InetAddress в Java?
У меня есть необходимость создать объект http или https URL из адреса IPv4 (объекты String или InetAddress - любой в порядке) в Java. Я был в этом в течение 10 часов.
Попытки поразить стену описаны ниже:
Попытка № 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");
работает. - На данный момент я застрял. Я понятия не имею, что изменить, или как двигаться вперед.
- В учебнике говорится, что URL может быть "protocol://host", где host - это имя хоста или IP-адрес. но создать URL-адрес, как это:
Попытка № 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()", но это тоже не сработало.
Я пытаюсь выяснить, как открыть сайт, используя 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 спасибо, что нашли время, чтобы помочь. Очень признателен!