杰瑞科技汇

Java如何获取Linux服务器IP地址?

在Java中获取Linux系统的IP地址

在Java中获取Linux系统的IP地址有几种方法,以下是几种常见的实现方式:

方法1:使用InetAddress

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class GetLinuxIP {
    public static void main(String[] args) {
        try {
            // 获取所有网络接口
            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = networkInterfaces.nextElement();
                // 跳过回环接口和已关闭的接口
                if (networkInterface.isLoopback() || !networkInterface.isUp()) {
                    continue;
                }
                // 获取该接口的所有IP地址
                Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
                while (inetAddresses.hasMoreElements()) {
                    InetAddress inetAddress = inetAddresses.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        String ipAddress = inetAddress.getHostAddress();
                        System.out.println("Interface: " + networkInterface.getName() + 
                                         ", IP: " + ipAddress);
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}

方法2:执行Linux命令获取IP

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class GetLinuxIPByCommand {
    public static void main(String[] args) {
        try {
            // 执行ip命令
            Process process = Runtime.getRuntime().exec("ip addr");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                // 简单解析IP地址(可以根据需要调整正则表达式)
                if (line.contains("inet ") && !line.contains("127.0.0.1")) {
                    String ip = line.split("\\s+")[1].split("/")[0];
                    System.out.println("IP: " + ip);
                }
            }
            process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法3:使用/proc/net/dev文件

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class GetIPFromProcNet {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("/proc/net/dev"))) {
            String line;
            reader.readLine(); // 跳过标题行
            while ((line = reader.readLine()) != null) {
                String[] parts = line.split("\\s+");
                String interfaceName = parts[0].replace(":", "");
                // 跳过回环接口
                if (interfaceName.equals("lo")) {
                    continue;
                }
                // 这里可以进一步解析IP地址
                // 实际IP信息通常在/proc/net/if_inet6或ifconfig命令中
                System.out.println("Interface: " + interfaceName);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意事项

  1. 权限问题:某些方法可能需要root权限才能访问网络接口信息
  2. 多网卡环境:服务器通常有多个网络接口,需要根据需求选择正确的IP
  3. IPv6支持:如果需要支持IPv6,需要修改代码来识别IPv6地址
  4. 容器环境:在Docker等容器中,获取IP的方式可能不同

获取特定网卡的IP

如果需要获取特定网卡(如eth0)的IP地址,可以修改方法1:

public static String getSpecificInterfaceIP(String interfaceName) {
    try {
        NetworkInterface networkInterface = NetworkInterface.getByName(interfaceName);
        if (networkInterface != null && networkInterface.isUp()) {
            Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
            while (inetAddresses.hasMoreElements()) {
                InetAddress inetAddress = inetAddresses.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    return inetAddress.getHostAddress();
                }
            }
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }
    return null;
}

选择哪种方法取决于你的具体需求和运行环境,方法1是最通用的Java方式,方法2和3则更依赖于Linux系统特性。

分享:
扫描分享到社交APP
上一篇
下一篇