вторник, 15 мая 2012 г.

Как в java определить свой внешний IP адрес

Программно определить внешний 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;
    }

6 комментариев:

  1. Атя-тя. Комменты трем как при кровавом совке

    ОтветитьУдалить
    Ответы
    1. Если б коммент был написан корректно, я б его не удалял. Я всегда принимаю конструктивную критику.
      Выражайся нормально, без оскорблений и ругательств, тогда и комментарии не буду стирать.

      Удалить
  2. интересно этот метод будет быстрей работать на regexp в отличии от indexOf( ?

    ОтветитьУдалить
    Ответы
    1. Скорее всего на regexp будет работать медленнее. Но это не слишком важно, т.к. здесь узкое место (самое медленное) - получение ip c сайта и оптимизация парсинга ip почти не уменьшит время получения ip c сайта в целом.

      Удалить
  3. да эт то понятно, что узкое место - это скачивание html файла !, просто я в своей проге ранее писал все на indexof, а как дорвался до regexp влюбился в них (как в GLSL или sqlite) , а тут вдруг подумал оффтоп: чтож будет побыстрее? кстати в моей проге (клиент для пиринговой сети dc++ nanodc парсятся пакеты по 64 кб в секунду на слабом андроиде) разницы вообще не заметил, что при индексе, что регулярка ... а ваш метод через myip.by я себе заберу если не возражаете ? переделав на регулярку конечно же

    ОтветитьУдалить
    Ответы
    1. Забирайте конечно, мне не жалко :). По поводу regexp - по моему опыту они работают почти всегда на порядок медленнее, чем простые операции со строками, такие как indexOf и т.д., скорее всего здесь будет то же самое.

      Удалить

Ярлыки

java (31) оптимизация (7) CPanel (5) svn (5) windows xp (5) ошибка (5) свой сервер (5) файлы и папки (5) gui (4) регулярные выражения (4) jacoco (3) redmine (3) windows (3) автоматизация (3) защита данных (3) резервное копирование (3) сервер (3) JavaScript (2) Oracle SQL (2) adsl модем (2) apache maven (2) apache tomcat (2) coverage (2) dropbox (2) excel (2) firewall (2) netbeans (2) office 2007 (2) samsung (2) system tray (системный трей) (2) xerox (2) вирусы (2) принтер (2) сериализация (2) удаленный рабочий стол (2) HTML (1) JFileChooser (1) MySQL (1) Nokia (1) Ovi (1) P660R-T1 (1) WakeOnLan (1) blogger.com (1) ctfmon.exe (1) email (1) flash память (1) ftp (1) integration testing (1) ip (1) jQuery (1) jvisualWm (1) log4j (1) look and feel (1) myBatis (1) php (1) serialVersionUID (1) skype (1) smtp (1) ssh (1) swing (1) torrents (1) unit-testing (1) unix (1) vpn (1) windows 7 (1) xStarter (1) zip (1) безопасность (1) вход в систему (1) дизайн (1) документация (1) заправка (1) интернет (1) логирование (1) мышь (1) патч (1) перенос (1) печать (1) плагины (1) почтовые сообщения (1) программирование (1) процессы (1) прошивка (1) сеть (1) сеть. ошибка (1) скрытые файлы (1) списки (1) фильтрация (1) фокус (1) часовые пояса (1) шифрование (1) экран (1)