やっていることは、自分のPCが所持しているアドレスをすべて探索し、それらをIPv4の正規表現でチェックしているだけです。また、このときループバックアドレスは除外している。IPv6も正規表現を変えれば対応できます。
Pattern p = Pattern.compile("^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$");
try {
Enumeration<NetworkInterface> enuIfs = NetworkInterface.getNetworkInterfaces();
while (enuIfs.hasMoreElements()) {
NetworkInterface nic = enuIfs.nextElement();
Enumeration<InetAddress> enuAddress = nic.getInetAddresses();
while (enuAddress.hasMoreElements()) {
InetAddress address = enuAddress.nextElement();
Matcher m = p.matcher(address.getHostName());
if (m.find() && !address.isLoopbackAddress()) {
System.out.println(address.getHostName());
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
補足
- ローカルホストを取得する方法として、InetAddress.getLocalHost()でアドレスを取得できるが、PCが複数アドレスを所持している場合は、こちらはうまく動作しない場合がある。
- IPv4の判定として"address instanceof Inet4Address" といった感じでクラスでも判定できる。しかし、こちらでやるとローカルホストだけでなく、他のNICのアドレスも取得できてしまう(例えばVmwareを使っている場合は、VMware Network AdapterのIPも取得できる)。 そこで、今回はアドレスのホスト名をIPv4の正規表現でチェックして判定している。こちらの方法だと、ローカルホストだけ取得できた。