package info.istlab.ServerTester;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class NetworkInterfaceSelector extends JDialog implements ActionListener {
// 複数のIPv4アドレスを持つネットワークインターフェースがある場合、ユーザに選択させる。
public static NetworkInterface getPrimaryInterface() {
ArrayList<NetworkInterface> ipv4interfaces = getIPv4Interfaces();
if (ipv4interfaces.size() == 1) {
return ipv4interfaces.get(0);
} else {
// 複数のインターフェースがある場合、ユーザに選択させる
NetworkInterfaceSelector selector = new NetworkInterfaceSelector(ipv4interfaces);
NetworkInterface ni = selector.getSelectedInterface();
return ni;
}
}
static JFrame dummy;
ArrayList<NetworkInterface> interfaces;
NetworkInterface selectedInterface;
Hashtable<String, NetworkInterface> hash;
boolean okClicked = false;
public NetworkInterfaceSelector(ArrayList<NetworkInterface> interfaces) {
super(dummy = new JFrame("Notice !! Click Here !!"), "ネットワークインタフェースを選択してください", true);
this.interfaces = interfaces;
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
hash = new Hashtable<String, NetworkInterface>();
for (NetworkInterface obj : interfaces) {
String label = obj.toString()+ " / "+ NetworkInterfaceSelector.getPrimaryInetAddr(obj).getHostAddress();
if (obj.toString().startsWith("name:w")){
label = new String(label + " ← Wi-Fi (無線LAN)");
} else if (label.startsWith("name:en")){
label = new String(label + " ← Ethernet (有線LAN)");
}
JButton b = new JButton(label);
b.addActionListener(this);
add(b);
hash.put(label, obj);
}
JButton cancelB;
cancelB = new JButton("cancel");
cancelB.addActionListener(e -> {
okClicked = false;
System.out.println("Cancel is clicked.");
dispose();
});
add(cancelB);
pack();
setLocation(centerOfScreen(getSize()));
}
public boolean showDialog() {
okClicked = false;
dummy.setSize(300, 50);
dummy.setLocation(getLocation().x + 30, getLocation().y - 30);
dummy.setVisible(true);
setVisible(true);
setAlwaysOnTop(true);
return okClicked;
}
public NetworkInterface getSelectedInterface() {
if (showDialog()) {
return selectedInterface;
}
return null;
}
public static ArrayList<NetworkInterface> getIPv4Interfaces() {
ArrayList<NetworkInterface> ret = new ArrayList<NetworkInterface>();
try {
// 利用可能なネットワークインターフェースを取得
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
// 各インターフェースの情報を表示
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
// インターフェース名と表示名を出力
// System.out.println("Name: " + networkInterface.getName());
// System.out.println("Display Name: " + networkInterface.getDisplayName());
// System.out.println("Up: " + networkInterface.isUp());
// System.out.println("Loopback: " + networkInterface.isLoopback());
// System.out.println("Virtual: " + networkInterface.isVirtual());
// System.out.println("Supports Multicast: " + networkInterface.supportsMulticast());
// ループバックインターフェースは除外
if (networkInterface.isLoopback()) {
continue;
}
// dockerの仮想インターフェースは除外
if (networkInterface.getName().startsWith("docker")) {
continue;
}
// VPNの仮想インターフェースは除外
if (networkInterface.getName().startsWith("utun")) {
continue;
}
if (networkInterface.getName().startsWith("vnic")) {
continue;
}
if (networkInterface.getName().startsWith("vmnet")) {
continue;
}
if (networkInterface.getName().startsWith("vboxnet")) {
continue;
}
if (networkInterface.getName().startsWith("tap")) {
continue;
}
if (networkInterface.getName().startsWith("tun")) {
continue;
}
// InterfaceAddress を取得して IPv4 アドレスを表示
List<InterfaceAddress> addresses = networkInterface.getInterfaceAddresses();
for (InterfaceAddress addr : addresses) {
InetAddress inetAddr = addr.getAddress();
if (inetAddr instanceof java.net.Inet4Address) { // IPv4 アドレスのみ
// System.out.println("IPv4 Address: " + inetAddr.getHostAddress());
ret.add(networkInterface);
}
}
// System.out.println("----------------------------------------------------");
}
} catch (SocketException e) {
e.printStackTrace();
}
return ret;
}
@Override
public void actionPerformed(ActionEvent e) {
selectedInterface = hash.get(e.getActionCommand());
okClicked = true;
dispose();
dummy.dispose();
}
public static InetAddress getPrimaryInetAddr(NetworkInterface primaryInterface) {
List<InterfaceAddress> addresses = primaryInterface.getInterfaceAddresses();
for (InterfaceAddress addr : addresses) {
InetAddress inetAddr = addr.getAddress();
if (inetAddr instanceof java.net.Inet4Address) { // IPv4 アドレスのみ
return inetAddr;
}
}
return null;
}
public static Point centerOfScreen(Dimension winSize) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
return new Point((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / 2);
}
}