banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[Linux]JavaでローカルネットワークカードのIPアドレスを取得する

Windows 環境からアプリケーションサーバーを Linux 環境に移行する際に、ローカル IP アドレスを取得できない問題が発生しました。原因は以下の Java コードが Linux では直接 127.0.0.1 を返すためです。Windows では有効な InetAddress は Linux では機能しません。

public static String getLocalIP() {
String ip = "";
try {
InetAddress address = InetAddress.getLocalHost();
if(address != null) {
ip = address.getHostAddress();
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
return ip;
}

原因は、Java が使用する JNI コードが Linux の gethostname カーネル関数を呼び出しているためです。この関数は、Linux ホストが IP にバインドされていない場合、ホストファイルの定義に基づいてデフォルトの localhost または 127.0.0.1 を返します。

後で NetworkInterface を使用するように変更し、IP アドレスを取得できるようにしました。

public static String getLocalIP() {
Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces();
InetAddress ip = null;
while (allNetInterfaces.hasMoreElements()) {
NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
System.out.println(netInterface.getName());
Enumeration addresses = netInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
ip = (InetAddress) addresses.nextElement();
if (ip != null && ip instanceof Inet4Address) {
return ip.getHostAddress();
}
}
}
}
return "";
}

最後に、複数のネットワークインターフェースに対してループ処理を行う必要があるため、ここでは IPv4 の IP アドレスのみを取得しています。

public static List getLocalIPList() {
List ipList = new ArrayList();
try {
Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
NetworkInterface networkInterface;
Enumeration inetAddresses;
InetAddress inetAddress;
String ip;
while (networkInterfaces.hasMoreElements()) {
networkInterface = networkInterfaces.nextElement();
inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
inetAddress = inetAddresses.nextElement();
if (inetAddress != null && inetAddress instanceof Inet4Address) { // IPV4
ip = inetAddress.getHostAddress();
ipList.add(ip);
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return ipList;
}

参考 http://www.linuxidc.com/Linux/2012-12/75498.htm https://my.oschina.net/zhongwenhao/blog/307879 http://www.blogjava.net/icewee/archive/2013/07/19/401739.html

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。