Программно определить внешний IP не так уж и просто как может показаться на первый взгляд. В java нет да и не может быть стандартной функции для получения IP адреса своего компьютера в интернете. При этом ip адрес компьютера в локальной сети получить достаточно просто, для этого можно воспользоваться классом InetAddress.
InetAddress addr = InetAddress.getLocalHost();
String myLANIP = addr.getHostAddress();
Для получения внешнего IP необходимо подключиться к какому-нибудь серверу в интернете, который вернет IP под которым он видит данный компьютер. В общем случае необходимо подключится к серверу (сайту) предоставляющему услугу определения IP, получить ответ в виде html кода и выделить из этого кода IP адрес. Ниже приведен пример с использованием сервиса http://myip.by/ - он удобен тем, что возвращает минимум лишней информации.
private static String getCurrentIP() {
String result = null;
try {
BufferedReader reader = null;
try {
URL url = new URL("http://myip.by/");
InputStream inputStream = null;
inputStream = url.openStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder allText = new StringBuilder();
char[] buff = new char[1024];
int count = 0;
while ((count = reader.read(buff)) != -1) {
allText.append(buff, 0, count);
}
// Строка содержащая IP имеет следующий вид
// <a href="whois.php?127.0.0.1">whois 127.0.0.1</a>
Integer indStart = allText.indexOf("\">whois ");
Integer indEnd = allText.indexOf("</a>", indStart);
String ipAddress = new String(allText.substring(indStart + 8, indEnd));
if (ipAddress.split("\\.").length == 4) { // минимальная (неполная)
//проверка что выбранный текст является ip адресом.
result = ipAddress;
}
} catch (MalformedURLException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
Атя-тя. Комменты трем как при кровавом совке
ОтветитьУдалитьЕсли б коммент был написан корректно, я б его не удалял. Я всегда принимаю конструктивную критику.
УдалитьВыражайся нормально, без оскорблений и ругательств, тогда и комментарии не буду стирать.
интересно этот метод будет быстрей работать на regexp в отличии от indexOf( ?
ОтветитьУдалитьСкорее всего на regexp будет работать медленнее. Но это не слишком важно, т.к. здесь узкое место (самое медленное) - получение ip c сайта и оптимизация парсинга ip почти не уменьшит время получения ip c сайта в целом.
Удалитьда эт то понятно, что узкое место - это скачивание html файла !, просто я в своей проге ранее писал все на indexof, а как дорвался до regexp влюбился в них (как в GLSL или sqlite) , а тут вдруг подумал оффтоп: чтож будет побыстрее? кстати в моей проге (клиент для пиринговой сети dc++ nanodc парсятся пакеты по 64 кб в секунду на слабом андроиде) разницы вообще не заметил, что при индексе, что регулярка ... а ваш метод через myip.by я себе заберу если не возражаете ? переделав на регулярку конечно же
ОтветитьУдалитьЗабирайте конечно, мне не жалко :). По поводу regexp - по моему опыту они работают почти всегда на порядок медленнее, чем простые операции со строками, такие как indexOf и т.д., скорее всего здесь будет то же самое.
Удалить