java 在java中获取默认网关

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5945288/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 13:35:46  来源:igfitidea点击:

Get default gateway in java

javanetworkingdnsipgateway

提问by Nirmal- thInk beYond

I want to fetch default gateway for local machine using java. I know how to get it by executing dos or shell commands, but is there any another way to fetch? Also need to fetch primary and secondary dns ip.

我想使用 java 获取本地机器的默认网关。我知道如何通过执行 dos 或 shell 命令来获取它,但是还有其他方法可以获取吗?还需要获取主要和次要的 dns ip。

采纳答案by squawknull

There is not an easy way to do this. You'll have to call local system commands and parse the output, or read configuration files or the registry. There is no platform independent way that I'm aware of to make this work - you'll have to code for linux, mac and windows if you want to run on all of them.

没有一种简单的方法可以做到这一点。您必须调用本地系统命令并解析输出,或者读取配置文件或注册表。我知道没有独立于平台的方式来完成这项工作——如果你想在所有这些平台上运行,你必须为 linux、mac 和 windows 编写代码。

See How can I determine the IP of my router/gateway in Java?

请参阅如何在 Java 中确定路由器/网关的 IP?

That covers the gateway, and you could use ifconfig or ipconfig as well to get this. For DNS info, you'll have to call a different system command such as ipconfig on Windows or parse /etc/resolv.conf on Linux or mac.

这涵盖了网关,您也可以使用 ifconfig 或 ipconfig 来获取它。对于 DNS 信息,您必须调用不同的系统命令,例如 Windows 上的 ipconfig 或解析 Linux 或 mac 上的 /etc/resolv.conf。

回答by motas

My wayis:

我的方法是:

try(DatagramSocket s=new DatagramSocket())
{
    s.connect(InetAddress.getByAddress(new byte[]{1,1,1,1}), 0);
    return NetworkInterface.getByInetAddress(s.getLocalAddress()).getHardwareAddress();
}

Because of using datagram (UDP), it isn't connecting anywhere, so port number may be meaningless and remote address (1.1.1.1) needn't be reachable, just routable.

由于使用数据报 (UDP),它不会在任何地方连接,因此端口号可能没有意义,远程地址 (1.1.1.1) 不需要可达,只需可路由。

回答by Ian Campbell


In Windows with the help of ipconfig:


在 Windows 的帮助下ipconfig

import java.awt.Desktop;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;

public final class Router {

    private static final String DEFAULT_GATEWAY = "Default Gateway";

    private Router() {
    }

    public static void main(String[] args) {
        if (Desktop.isDesktopSupported()) {
            try {
                Process process = Runtime.getRuntime().exec("ipconfig");

                try (BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(process.getInputStream()))) {

                    String line;
                    while ((line = bufferedReader.readLine()) != null) {
                        if (line.trim().startsWith(DEFAULT_GATEWAY)) {
                            String ipAddress = line.substring(line.indexOf(":") + 1).trim(),
                                    routerURL = String.format("http://%s", ipAddress);

                            // opening router setup in browser
                            Desktop.getDesktop().browse(new URI(routerURL));
                        }

                        System.out.println(line);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Here I'm getting the default gateway IP address of my router, and opening it in a browser to see my router's setup page.

在这里,我获得了路由器的默认网关 IP 地址,并在浏览器中打开它以查看路由器的设置页面。

回答by Femi

There is currently no standard interface in Java to obtain the default gateway or the DNS server addresses. You will need a shell command.

Java 中目前没有标准接口来获取默认网关或 DNS 服务器地址。您将需要一个 shell 命令。

回答by PCK4D

I'm not sure if it works on every system but at least here I found this:

我不确定它是否适用于每个系统,但至少在这里我发现了这一点:

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 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];
        }
    }
}

For me this produces:

对我来说,这会产生:

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