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); } }