Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / NetworkInterfaceSelector.java
@motoki miura motoki miura on 21 Sep 6 KB d
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);
    }
}