Как я могу определить IP моего маршрутизатора / шлюза в Java? - PullRequest
15 голосов
/ 15 августа 2008

Как я могу определить IP моего маршрутизатора / шлюза в Java? Я могу получить свой IP достаточно легко. Я могу получить свой интернет-IP с помощью службы на веб-сайте. Но как я могу определить IP своего шлюза?

Это очень просто в .NET, если вы знаете, как это сделать. Но как вы делаете это на Java?

Ответы [ 16 ]

23 голосов
/ 29 октября 2008

В Windows, OSX, Linux и т. Д. Ответ Криса Банча может быть значительно улучшен с помощью

netstat -rn

вместо команды traceroute.

IP-адрес вашего шлюза появится во втором поле строки, которая начинается с default или 0.0.0.0.

Это позволяет решить ряд проблем при попытке использовать traceroute:

  1. в Windows traceroute на самом деле tracert.exe, поэтому нет необходимости в O / S-зависимостях в коде
  2. это быстрая команда для запуска - она ​​получает информацию из O / S, а не из сети
  3. traceroute иногда блокируется сетью

Единственным недостатком является то, что необходимо будет читать строки из вывода netstat до тех пор, пока не будет найдена правая строка, поскольку будет более одной строки вывода.

РЕДАКТИРОВАТЬ: IP-адрес шлюза по умолчанию находится во втором поле строки, которая начинается с «по умолчанию», если вы находитесь на MAC (проверено на Lion), или в третьем поле строки, начинающейся с '0.0.0.0' (протестировано в Windows 7)

Windows

Метрика интерфейса сетевого шлюза назначения сети

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

Mac:

Флаги шлюза назначения Ссылки Использовать Netif Expire

по умолчанию 192.168.2.254 UGSc 104 4 en1

10 голосов
/ 15 августа 2008

К сожалению, Java не делает это таким же приятным, как другие языки. Вот что я сделал:

import java.io.*;
import java.util.*;

public class ExecTest {
    public static void main(String[] args) throws IOException {
        Process result = Runtime.getRuntime().exec("traceroute -m 1 www.amazon.com");

        BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
        String thisLine = output.readLine();
        StringTokenizer st = new StringTokenizer(thisLine);
        st.nextToken();
        String gateway = st.nextToken();
        System.out.printf("The gateway is %s\n", gateway);
    }
}

Это предполагает, что шлюз является вторым токеном, а не третьим. Если это так, вам нужно добавить дополнительные st.nextToken();, чтобы продвинуть токенизатор еще на одну точку.

4 голосов
/ 29 октября 2008
try{
    Process result = Runtime.getRuntime().exec("netstat -rn");

    BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));

    String line = output.readLine();
    while(line != null){
        if ( line.startsWith("default") == true )
            break;      
        line = output.readLine();
    }

    StringTokenizer st = new StringTokenizer( line );
    st.nextToken();
    gateway = st.nextToken();
    st.nextToken();
    st.nextToken();
    st.nextToken();
    adapter = st.nextToken();

} catch( Exception e ) { 
    System.out.println( e.toString() );
    gateway = new String();
    adapter = new String();
}
3 голосов
/ 14 сентября 2008

При разборе Windows вывод IPConfig предоставит вам шлюз по умолчанию, не ожидая трассировки.

2 голосов
/ 25 января 2012

Эта версия подключается к www.whatismyip.com, считывает содержимое сайта и ищет с помощью регулярных выражений IP-адрес и печатает его в cmd. Небольшое улучшение кода MosheElishas

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader; 
import java.net.URL;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  

public class Main {

    public static void main(String[] args) {
        BufferedReader buffer = null;
        try {
            URL url = new URL(
                    "http://www.whatismyip.com/tools/ip-address-lookup.asp");
            InputStreamReader in = new InputStreamReader(url.openStream());
            buffer = new BufferedReader(in);
            String line = buffer.readLine();
            Pattern pattern = Pattern
                    .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)");
            Matcher matcher;
            while (line != null) {
                matcher = pattern.matcher(line);
                if (matcher.matches()) {
                    line = matcher.group(2) + "." + matcher.group(3) + "."
                            + matcher.group(4) + "." + matcher.group(5);
                    System.out.println(line);
                }
                line = buffer.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                if (buffer != null) {
                    buffer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader; 
import java.net.URL;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  

public class Main {

    public static void main(String[] args) {
        BufferedReader buffer = null;
        try {
            URL url = new URL(
                    "http://www.whatismyip.com/tools/ip-address-lookup.asp");
            InputStreamReader in = new InputStreamReader(url.openStream());
            buffer = new BufferedReader(in);
            String line = buffer.readLine();
            Pattern pattern = Pattern
                    .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)");
            Matcher matcher;
            while (line != null) {
                matcher = pattern.matcher(line);
                if (matcher.matches()) {
                    line = matcher.group(2) + "." + matcher.group(3) + "."
                            + matcher.group(4) + "." + matcher.group(5);
                    System.out.println(line);
                }
                line = buffer.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                if (buffer != null) {
                    buffer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
2 голосов
/ 23 апреля 2009

вывод команды netstat -rn зависит от локали. в моей системе (locale = de) вывод выглядит так: ... Стандартные ворота: 10.22.0.1

, поэтому нет строки, начинающейся с 'default'.

поэтому использование netstat может быть не очень хорошей идеей.

2 голосов
/ 14 сентября 2008

Чтобы преодолеть проблемы, упомянутые с traceroute (основанный на ICMP, охват большой области), вы можете рассмотреть:

  1. traceroute к вашему общедоступному IP-адресу (избегает широкого охвата, но все же ICMP)
  2. Используйте не-ICMP утилиту, такую ​​как ifconfig / ipconfig (с этим проблемы переносимости).
  3. То, что сейчас кажется лучшим и наиболее переносимым решением, - это оболочка и анализ netstat (см. Пример кода здесь )
2 голосов
/ 06 сентября 2008

Относительно UPnP: учтите, что не все маршрутизаторы поддерживают UPnP. И если они это сделают, это может быть отключено (по соображениям безопасности). Так что ваше решение может не всегда работать.

Вы также должны взглянуть на NatPMP.

Простую библиотеку для UPnP можно найти по адресу http://miniupnp.free.fr/,, хотя она находится в C ...

2 голосов
/ 15 августа 2008

Возможно, вам лучше использовать что-то вроде checkmyip.org, который будет определять ваш общедоступный IP-адрес - не обязательно ваш маршрутизатор первого прыжка: в Uni у меня есть «настоящий» IP-адрес, тогда как дома это общедоступный мой локальный маршрутизатор IP-адрес.

Вы можете проанализировать возвращаемую страницу или найти другой сайт, который позволяет просто вернуть IP-адрес в качестве единственной строки.

(я имею в виду загрузить этот URL на Java / что угодно, а затем получить необходимую информацию).

Это должно быть полностью независимым от платформы.

1 голос
/ 17 апреля 2016

Вы можете использовать команду netstat -rn, которая доступна на платформе Windows, OSX, Linux и т. Д. Вот мой код:

private String getDefaultAddress() {
        String defaultAddress = "";
        try {
            Process result = Runtime.getRuntime().exec("netstat -rn");

            BufferedReader output = new BufferedReader(new InputStreamReader(
                    result.getInputStream()));

            String line = output.readLine();
            while (line != null) {
                if (line.contains("0.0.0.0")) {

                    StringTokenizer stringTokenizer = new StringTokenizer(line);
                    stringTokenizer.nextElement(); // first element is 0.0.0.0
                    stringTokenizer.nextElement(); // second element is 0.0.0.0
                    defaultAddress = (String) stringTokenizer.nextElement();
                    break;
                }

                line = output.readLine();

            } // while
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return defaultAddress;

} // getDefaultAddress
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...