java获取linux服务器上的IP操作
在编码过程中需要获取本地IP地址,⾸先使⽤的是下⾯的⽅法,在Windows环境正常,但是linux服务器上就获取不到,public static String getIpAddress() {
String hostAddress = "";
try {
InetAddress address = LocalHost();
hostAddress = HostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return hostAddress;
}
这样在linux上依然获取到的是127.0.0.1,
查询服务器上⾯IP发现:
[mm_cbms1@localhost ~]$ ip address
1:springboot其实就是spring
lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2:
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:50:56:a2:0d:1b brd ff:ff:ff:ff:ff:ff
inet 10.12.8.243/24 brd 10.12.8.255 scope global eth0
inet6 fe80::250:56ff:fea2:d1b/64 scope link
valid_lft forever preferred_lft forever
这⾥⾸先要了解上⾯列出的接⼝中的含义:
1、linux的⽹络接⼝之扫盲
(1) ⽹络接⼝的命名
这⾥并不存在⼀定的命名规范,但⽹络接⼝名字的定义⼀般都是要有意义的。例如:
eth0: ethernet的简写,⼀般⽤于以太⽹接⼝。
wifi0:wifi是⽆线局域⽹,因此wifi0⼀般指⽆线⽹络接⼝。
ath0: Atheros的简写,⼀般指Atheros芯⽚所包含的⽆线⽹络接⼝。
lo: local的简写,⼀般指本地环回接⼝。
(2) ⽹络接⼝如何⼯作
⽹络接⼝是⽤来发送和接受数据包的基本设备。
系统中的所有⽹络接⼝组成⼀个链状结构,应⽤层程序使⽤时按名称调⽤。
每个⽹络接⼝在linux系统中对应于⼀个struct net_device结构体,包含name,mac,mask,mtu…信息。
每个硬件⽹卡(⼀个MAC)对应⼀个⽹络接⼝,其⼯作完全由相应的驱动程序控制。
(3) 虚拟⽹络接⼝
虚拟⽹络接⼝的应⽤范围⾮常⼴泛。最着名的当属“lo”了,基本上每个linux系统都有这个接⼝。
虚拟⽹络接⼝并不真实地从外界接收和发送数据包,⽽是在系统内部接收和发送数据包,因此虚拟⽹络接⼝不需要驱动程序。
虚拟⽹络接⼝和真实存在的⽹络接⼝在使⽤上是⼀致的。
(4) ⽹络接⼝的创建
硬件⽹卡的⽹络接⼝由驱动程序创建。⽽虚拟的⽹络接⼝由系统创建或通过应⽤层程序创建。
驱动中创建⽹络接⼝的函数是:register_netdev(struct net_device *)或者register_netdevice(struct net_device *)。
这两个函数的区别是:register_netdev(…)会⾃动⽣成以”eth”作为打头名称的接⼝,⽽register_netdevice(…)需要提前指定接⼝名称.事实上,register_netdev(…)也是通过调⽤register_netdevice(…)实现的。
2、LINUX中的lo(回环接⼝)
1) 什么是LO接⼝?
在LINUX系统中,除了⽹络接⼝eth0,还可以有别的接⼝,⽐如lo(本地环路接⼝)。
2) LO接⼝的作⽤是什么?
假如包是由⼀个本地进程为另⼀个本地进程产⽣的, 它们将通过外出链的'lo'接⼝,然后返回进⼊链的'lo'接⼝。
其实getLocalHost⽅法获取的是lo接⼝对应的IP地址,了解了上述问题那java编码如何获取正确的地址呢?
java为了⽅便⽹络编程,提供了表⽰IP地址的类、表⽰⽹络接⼝(这个接⼝是指⽹卡)的类,表⽰⽹络连接接⼝的类,例如InetAddress,但是测试发现NetworkInterface类同样提供了获取本地计算机⽹络接⼝相关的信息的⽅法。尽管InetAddress类提供获取IP地址的⽅法,但是要想获取本机的⽹络接⼝的详细信息,还需要依赖NetworkInterface接⼝中的⽅法。测试发现下⾯⽅法可以获得服务器对应的IP地址,在linux服务器上和本地测试通过
(1)
public static String getInet4Address() {
Enumeration<NetworkInterface> nis;
String ip = null;
try {
nis = NetworkInterfaces();
for (; nis.hasMoreElements();) {
NetworkInterface ni = Element();
Enumeration<InetAddress> ias = ni.getInetAddresses();
for (; ias.hasMoreElements();) {
InetAddress ia = Element();
//ia instanceof Inet6Address && !ia.equals("")
if (ia instanceof Inet4Address && !ia.getHostAddress().equals("127.0.0.1")) {
ip = ia.getHostAddress();
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ip;
}
(2)
public static InetAddress getCurrentIp() {
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) Element();
Enumeration<InetAddress> nias = ni.getInetAddresses();
while (nias.hasMoreElements()) {
InetAddress ia = (InetAddress) Element();
if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
return ia;
}
}
}
} catch (SocketException e) {
<(e.getStackTrace());
}
return null;
}
上述两个⽅法都可以获取正确的IP地址,具体NetworkInterface的使⽤还需要以后应⽤到了进⾏深⼊研究⼀下
补充知识:Java获取所有⽹卡IP地址
Enumeration<NetworkInterface> networkInterfaces = NetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = Element();
Enumeration<InetAddress> inetAddresses = InetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = Element();
if (inetAddress.isLoopbackAddress()) {//回路地址,如127.0.0.1
System.out.println("loop addr:" + inetAddress);
} else if (inetAddress.isLinkLocalAddress()) {//
System.out.println("link addr:" + inetAddress);
} else {
//⾮链接和回路真实ip
System.out.println("ip:" + inetAddress);
}
}
}
结果:
loop addr:/127.0.0.1
loop addr:/0:0:0:0:0:0:0:1
ip:/192.168.10.89
以上这篇java获取linux服务器上的IP操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论