12

Javaを介してLinux上のコンピュータのIPを取得するにはどうすればよいですか?

ネットで例を検索し、NetworkInterfaceクラスに関する何かを見つけましたが、IPアドレスを取得する方法に頭を悩ませることはできません。

複数のネットワークインターフェイスを同時に実行している場合はどうなりますか?どのIPアドレスが返されますか。

いくつかのコードサンプルを本当にいただければ幸いです。

PS:これまで、クロスプラットフォームアプリケーションには不適切なソリューションであるInetAddressクラスを使用していました。(win / Linux)。

4

5 に答える 5

31

外部からは見えないループバック アドレスを忘れないでください。これは、最初の非ループバック IP (IPv4 または IPv6) を抽出する関数です。

private static InetAddress getFirstNonLoopbackAddress(boolean preferIpv4, boolean preferIPv6) throws SocketException {
    Enumeration en = NetworkInterface.getNetworkInterfaces();
    while (en.hasMoreElements()) {
        NetworkInterface i = (NetworkInterface) en.nextElement();
        for (Enumeration en2 = i.getInetAddresses(); en2.hasMoreElements();) {
            InetAddress addr = (InetAddress) en2.nextElement();
            if (!addr.isLoopbackAddress()) {
                if (addr instanceof Inet4Address) {
                    if (preferIPv6) {
                        continue;
                    }
                    return addr;
                }
                if (addr instanceof Inet6Address) {
                    if (preferIpv4) {
                        continue;
                    }
                    return addr;
                }
            }
        }
    }
    return null;
}
于 2009-05-23T17:10:03.143 に答える
13

Javaチュートリアルから

なぜInetAddress良い解決策ではないのですか?クロスプラットフォームの互換性に関するドキュメントに何も表示されませんか?

このコードは、すべてのネットワークインターフェイスを列挙し、それらの情報を取得します。

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNets 
{
    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
}  

以下は、サンプルプログラムからの出力例です。

Display name: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /121.153.225.59

Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1

于 2009-05-23T15:45:32.830 に答える
5

このコードは4meで機能しました:

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;


public class ShowIp {

    public static void main(String[] args) throws SocketException {
        NetworkInterface ni = NetworkInterface.getByName("eth0");
        Enumeration<InetAddress> inetAddresses =  ni.getInetAddresses();


        while(inetAddresses.hasMoreElements()) {
            InetAddress ia = inetAddresses.nextElement();
            if(!ia.isLinkLocalAddress()) {
                System.out.println("IP: " + ia.getHostAddress());
            }
        }
    }

}
于 2011-09-24T18:56:13.800 に答える
4

Parallels などのソフトウェアによって作成された可能性があるため、最初の非ループバック インターフェイスを返すだけでは問題ありません。eth0 を探してみるほうがよいでしょう。

static private InetAddress getIPv4InetAddress() throws SocketException, UnknownHostException {

    String os = System.getProperty("os.name").toLowerCase();

    if(os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0) {   
        NetworkInterface ni = NetworkInterface.getByName("eth0");

        Enumeration<InetAddress> ias = ni.getInetAddresses();

        InetAddress iaddress;
        do {
            iaddress = ias.nextElement();
        } while(!(iaddress instanceof Inet4Address));

        return iaddress;
    }

    return InetAddress.getLocalHost();  // for Windows and OS X it should work well
}
于 2012-01-15T21:17:00.217 に答える
0

私の場合の最も簡単な解決策はでしたSocket.getLocalAddress()。その目的のために特別にソケットを開く必要がありましたが、Ubuntu 10.04マシンのすべてのNetworkInterfacesで、外部IPアドレスを取得する唯一の方法でした。

于 2011-12-06T22:18:45.347 に答える