Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / AddPanel.java
package info.istlab.ServerTester;

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 javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.text.NumberFormatter;

public class AddPanel extends JPanel {
    Host host;
    JComboBox<String> servBox;
    JTextField portField;
    JComboBox<String> bindBox;
    JSpinner portSpinner;

    public AddPanel(Host _host) {
        host = _host;

        String[] options = { "WebServer", "TimeServer", "ThreadTimeServer", "EchoServer", "ThreadEchoServer",
                "WhiteBoardServer", "SimpleWebSocketServer" };
        int[] defaultPorts = { 8081, 10123, 11123, 10008, 11008, 11111, 8887 };
        servBox = new JComboBox<String>(options);
        add(servBox);
        servBox.addActionListener(e -> {
            int index = servBox.getSelectedIndex();
            portSpinner.setValue(defaultPorts[index]);
        });

        // Port用のJSpinnerを作成
        SpinnerNumberModel model = new SpinnerNumberModel(8081, 1024, 65535, 1); // 初期値、最小値、最大値、ステップ
        portSpinner = new JSpinner(model);
        JSpinner.NumberEditor editor = new JSpinner.NumberEditor(portSpinner, "#");
        NumberFormatter format = (NumberFormatter) editor.getTextField().getFormatter();
        // format.setAllowsInvalid(false);
        format.setCommitsOnValidEdit(true);
        portSpinner.setEditor(editor);
        add(portSpinner);

        ArrayList<String> bindoptions = new ArrayList<String>();
        bindoptions.add("127.0.0.1");
        bindoptions.add("0.0.0.0");
        for (String netaddr : getHostAddresses()) {
            bindoptions.add(netaddr);
        }
        String[] bostring = new String[bindoptions.size()];
        bindoptions.toArray(bostring);
        bindBox = new JComboBox<String>(bostring);
        add(bindBox);

        JButton addButton = new JButton("Start New Server");
        add(addButton);
        addButton.addActionListener(e -> {
            try {
                String className = (String) servBox.getSelectedItem();
                long portLong = Long.parseLong(portSpinner.getValue().toString());
                System.out.println(portLong);
                int port = (int) portLong;
                String bindaddress = (String) bindBox.getSelectedItem();
                if (className.equals("SimpleWebSocketServer")) {
                    SimpleWebSocketServer wsserver = new SimpleWebSocketServer(port, bindaddress);
                    host.addPanel(new ServerPanel4WS(wsserver, host));
                    return;
                } else {
                    Server server = (Server) Class.forName("info.istlab.ServerTester." + className)
                            .getConstructor(int.class, String.class).newInstance(port, bindaddress);
                    host.addPanel(new ServerPanel(server, host));
                }
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        });
    }

    public ArrayList<String> getHostAddresses() {
        ArrayList<String> addresses = new ArrayList<String>();
        Enumeration<NetworkInterface> interfaces;
        try {
            interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) interfaces.nextElement();
                java.util.List<InterfaceAddress> interfaceAddresses = ni.getInterfaceAddresses();
                for (InterfaceAddress interfaceAddress : interfaceAddresses) {
                    InetAddress address = interfaceAddress.getAddress();
                    if (address.isLoopbackAddress()) {
                        continue;
                    }
                    if (interfaceAddress.getNetworkPrefixLength() > 32) {
                        continue;
                    }
                    int prefixLength = interfaceAddress.getNetworkPrefixLength();
                    int subnetMask = 0xffffffff << (32 - prefixLength);

                    // サブネットマスクを計算して表示
                    String subnetMaskString = String.format("%d.%d.%d.%d",
                            (subnetMask >> 24 & 0xff),
                            (subnetMask >> 16 & 0xff),
                            (subnetMask >> 8 & 0xff),
                            (subnetMask & 0xff));

                    // ネットワークアドレスの計算
                    int ipInt = inetAddressToInt(address);
                    int networkInt = ipInt & subnetMask;

                    String networkAddressString = String.format("%d.%d.%d.%d",
                            (networkInt >> 24) & 0xff,
                            (networkInt >> 16) & 0xff,
                            (networkInt >> 8) & 0xff,
                            networkInt & 0xff);

                    // 結果を表示
                    System.out.println("Interface: " + ni.getDisplayName());
                    System.out.println("IP Address: " + address.getHostAddress());
                    System.out.println("Subnet Mask: " + subnetMaskString);
                    System.out.println("Network Address: " + networkAddressString);
                    UDPClient.networkAddress = networkAddressString;
                    addresses.add(address.getHostAddress());
                }
            }
        } catch (SocketException e1) {
            e1.printStackTrace();
        }
        return addresses;
    }

    // IPアドレスを整数に変換するヘルパーメソッド
    private static int inetAddressToInt(InetAddress inetAddress) {
        byte[] addressBytes = inetAddress.getAddress();
        return ((addressBytes[0] & 0xff) << 24) |
                ((addressBytes[1] & 0xff) << 16) |
                ((addressBytes[2] & 0xff) << 8) |
                (addressBytes[3] & 0xff);
    }
}