如何在Java中确定路由器/网关的IP?我可以轻松地获得我的IP.我可以使用网站上的服务获取我的互联网IP.但是如何确定网关的IP?
如果你了解自己的方式,这在.NET中有点容易.但是你如何用Java做到这一点?
在Windows,OSX,Linux等上,Chris Bunch的答案可以通过使用来大大改善
netstat -rn
代替traceroute
命令.
您的网关的IP地址将出现在以default
或开始的行的第二个字段中0.0.0.0
.
这会在尝试使用时遇到许多问题traceroute
:
traceroute
实际上在Windows 上tracert.exe
,所以代码中不需要O/S依赖
它是一个快速运行的命令 - 它从O/S获取信息,而不是从网络获取信息
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 Expire
默认值 192.168.2.254 UGSc 104 4 en1
不幸的是,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();
以使标记器再推进一个位置.