如何确定在Java中我的路由器/网关的IP?(How can I determine the IP

2019-06-17 17:47发布

如何确定在Java中我的路由器/网关的IP? 我可以得到我的IP很轻松了。 我可以在网站上使用的服务让我的网络IP。 但我怎么能确定我的网关的IP?

如果你知道在你的方式这是在.NET有点容易。 但是,你如何做到这一点在Java中?

Answer 1:

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(); 以超前的标记生成一个多点。



Answer 2:

在Windows,OSX,Linux等则克里斯·班奇的回答,可以多使用改进

netstat -rn

代替的traceroute命令。

你的网关的IP地址会出现在启动任何行的第二个字段default0.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测试)

视窗:

网络目标网络掩码网关接口跃点数

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

苹果电脑:

目的网关参考文献标志使用NETIF过期

默认192.168.2.254 UGSC 104 4 EN1



Answer 3:

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();
}


Answer 4:

在解析IPConfig能输出将让你的默认网关,而无需等待跟踪窗口。



Answer 5:

在大学我有一个“真实”的IP地址,而在家里是我的本地路由器的公网IP地址:不一定是你的第一跳路由器 - 您可以使用类似checkmyip.org,这将决定你的公网IP地址会更好。

您可以分析返回的页面,或者找到其他网站,让您刚才得到的IP地址返回作为唯一的字符串。

(我的意思负载此URL中的Java /什么,然后得到你需要的信息)。

这应该是完全独立于平台。



Answer 6:

关于UPnP的:要知道,并不是所有的路由器支持UPnP。 如果他们这样做也可能被关闭(出于安全原因)。 所以你的解决方案可能并不总是工作。

你也应该看看NatPMP。

对UPnP的一个简单的库,可以发现http://miniupnp.free.fr/ ,尽管它在C ...



Answer 7:

为了克服的traceroute提到的问题(ICMP为主,广域命中),你可以考虑:

  1. traceroute命令你的公网IP(避免广域命中,但仍然ICMP)
  2. 使用非ICMP工具一样使用ifconfig / IPCONFIG(本虽然便携性问题)。
  3. 什么似乎现在最好的和最便携的解决方案是壳牌和netstat的解析(参见代码示例在这里 )


Answer 8:

的netstat -rn的输出是一个本地特定。 我的系统上(区域设置= DE)的输出是这样的:... Standardgateway:10.22.0.1

所以没有开头的行“默认”。

所以用netstat可能没有好主意。



Answer 9:

此版本连接到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();
            }
        }
    }
}


Answer 10:

这并不像听起来那么容易。 Java是平台无关的,所以我不知道如何做到这一点在Java中。 我猜测 ,.NET接触一些网站,其中报道了回去。 有一对夫妇的路要走。 首先,更深入地了解ICMP协议可以给你所需要的信息。 您还可以跟踪你去到(路线)的IP。 当你遇到一个IP,是不是在以下范围:

  • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255

它是一个IP跳从你走了,大概分享的信息数个字节与你的IP。

祝您好运。 我会好奇地听到一个明确的回答这个问题。



Answer 11:

尝试脱壳而出,如果您有它来进行路由跟踪。

“的traceroute -m 1个www.amazon.com”会发出这样的事情:

traceroute to www.amazon.com (72.21.203.1), 1 hops max, 40 byte packets
 1  10.0.1.1 (10.0.1.1)  0.694 ms  0.445 ms  0.398 ms

解析的第二行。 是的,它的丑陋,但它会让你走,直到有人发布了更好。



Answer 12:

马修:是的,这就是我的意思是“我可以在网站上使用的服务让我的互联网IP。” 对不起是巧舌如簧。

布莱恩/尼克:路由跟踪将是除了一个事实,即许多这些路由器都有ICMP禁用,因此它总是摊位罚款。

我想跟踪路由的组合和UPnP将制定出。 这就是我打算做,因为我只是希望我失去了一些东西明显。

谢谢大家对您的意见,所以这听起来像我绝不错过任何明显。 我已经开始为了发现网关中实现的UPnP一些位。



Answer 13:

您可以查询URL“ http://whatismyip.com/automation/n09230945.asp ”。 例如:

    BufferedReader buffer = null;
    try {
        URL url = new URL("http://whatismyip.com/automation/n09230945.asp");
        InputStreamReader in = new InputStreamReader(url.openStream());
        buffer = new BufferedReader(in);

        String line = buffer.readLine();
        System.out.println(line);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (buffer != null) {
                buffer.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


Answer 14:

在窗口中,您可以只使用下面的命令:

ipconfig | findstr /i "Gateway"

这将给你喜欢的输出:

Default Gateway . . . . . . . . . : 192.168.2.1
Default Gateway . . . . . . . . . : ::

然而,当我算出这个我不能运行使用Java,会后该命令。



Answer 15:

您可以使用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


Answer 16:

我不知道,如果它工作在每个系统上,但至少在这里我发现这一点:

import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main
{
    public static void main(String[] args)
    {
        try
        {
            //Variables to find out the Default Gateway IP(s)
            String canonicalHostName = InetAddress.getLocalHost().getCanonicalHostName();
            String hostName = InetAddress.getLocalHost().getHostName();

            //"subtract" the hostName from the canonicalHostName, +1 due to the "." in there
            String defaultGatewayLeftover = canonicalHostName.substring(hostName.length() + 1);

            //Info printouts
            System.out.println("Info:\nCanonical Host Name: " + canonicalHostName + "\nHost Name: " + hostName + "\nDefault Gateway Leftover: " + defaultGatewayLeftover + "\n");
            System.out.println("Default Gateway Addresses:\n" + printAddresses(InetAddress.getAllByName(defaultGatewayLeftover)));
        } catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
    }
    //simple combined string out of the address array
    private static String printAddresses(InetAddress[] allByName)
    {
        if (allByName.length == 0)
        {
            return "";
        } else
        {
            String str = "";
            int i = 0;
            while (i < allByName.length - 1)
            {
                str += allByName[i] + "\n";
                i++;
            }
            return str + allByName[i];
        }
    }
}

对我来说,这将产生:

Info:
Canonical Host Name: PCK4D-PC.speedport.ip
Host Name: PCK4D-PC
Default Gateway Leftover: speedport.ip

Default Gateway Addresses:
speedport.ip/192.168.2.1
speedport.ip/fe80:0:0:0:0:0:0:1%12

我需要在其他系统/配置/ PC-网关设置更多的测试,以确认它是否工作无处不在。 那种怀疑,但是这是第一次,我发现。



文章来源: How can I determine the IP of my router/gateway in Java?