diff --git a/.vscode/launch.json b/.vscode/launch.json index 93d50f7..e881968 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,6 +6,13 @@ "configurations": [ { "type": "java", + "name": "App", + "request": "launch", + "mainClass": "info.istlab.ServerTester.App", + "projectName": "KisoServerTester" + }, + { + "type": "java", "name": "WhiteBoardServer", "request": "launch", "mainClass": "info.istlab.ServerTester.WhiteBoardServer", diff --git a/src/main/java/info/istlab/ServerTester/AddPanel.java b/src/main/java/info/istlab/ServerTester/AddPanel.java index 1e0d0c9..6b7f8a4 100644 --- a/src/main/java/info/istlab/ServerTester/AddPanel.java +++ b/src/main/java/info/istlab/ServerTester/AddPanel.java @@ -13,6 +13,7 @@ import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; +import javax.swing.text.NumberFormatter; public class AddPanel extends JPanel { Host host; @@ -32,6 +33,11 @@ // 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 bindoptions = new ArrayList(); diff --git a/src/main/java/info/istlab/ServerTester/App.java b/src/main/java/info/istlab/ServerTester/App.java index 86bd8cd..907ce5a 100644 --- a/src/main/java/info/istlab/ServerTester/App.java +++ b/src/main/java/info/istlab/ServerTester/App.java @@ -19,11 +19,9 @@ myhost.addPanel(new ServerPanel(web, myhost)); WebServer web2 = new WebServer(8081, "0.0.0.0"); + // WebServer web2 = new WebServer(8081); myhost.addPanel(new ServerPanel(web2, myhost)); - // WebServer web3 = new WebServer(8081,"127.0.0.1"); - // myhost.addPanel(new ServerPanel(web3)); - TimeServer time = new TimeServer(); myhost.addPanel(new ServerPanel(time, myhost)); diff --git a/src/main/java/info/istlab/ServerTester/Server.java b/src/main/java/info/istlab/ServerTester/Server.java index 4ff6769..748ca68 100644 --- a/src/main/java/info/istlab/ServerTester/Server.java +++ b/src/main/java/info/istlab/ServerTester/Server.java @@ -12,17 +12,16 @@ Thread thread; int expectedPort; String expectedAddress; + boolean bindFailed = false; public static void invokeMain(String[] args, String className) { try { if (args.length == 0) { - Server server = (Server) Class.forName("info.istlab.ServerTester." + className) - .getConstructor().newInstance(); + Class.forName("info.istlab.ServerTester." + className).getConstructor().newInstance(); } else if (args.length == 1) { - Server server = (Server) Class.forName("info.istlab.ServerTester." + className) - .getConstructor(int.class).newInstance(Integer.parseInt(args[0])); + Class.forName("info.istlab.ServerTester." + className).getConstructor(int.class).newInstance(Integer.parseInt(args[0])); } else if (args.length == 2) { - Server server = (Server) Class.forName("info.istlab.ServerTester." + className) + Class.forName("info.istlab.ServerTester." + className) .getConstructor(int.class, String.class).newInstance(Integer.parseInt(args[0]), args[1]); } else { System.err.println("Usage: java info.istlab.ServerTester." + className + " [port] [bind-address]"); @@ -38,11 +37,15 @@ try { serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(bindaddress, port)); + bindFailed = false; + } catch (BindException bex){ + bindFailed = true; + JOptionPane.showMessageDialog(null, getClass().getName()+" バインド失敗しました。\n\nポート "+expectedPort+" とバインドアドレス "+expectedAddress+" の組み合わせは使用されています。\n既存のサービスを停止するか、ポート番号/バインドアドレスを変更してください。", "エラー", JOptionPane.ERROR_MESSAGE); } catch (IOException e) { System.err.println(e); - System.err.println("バインド失敗。ポート番号 " + port + " (Bind-address: " + bindaddress + " 向け) がすでにつかわれているようです"); - System.err.println("ポート番号またはバインドアドレスを変更してください。"); - System.err.println("またはコマンド killall java を実行して全てのJavaプロセスを終了してください。"); + // System.err.println("バインド失敗。ポート番号 " + port + " (Bind-address: " + bindaddress + " 向け) がすでにつかわれているようです"); + // System.err.println("ポート番号またはバインドアドレスを変更してください。"); + // System.err.println("またはコマンド killall java を実行して全てのJavaプロセスを終了してください。"); } System.out.println(getClass().getName() + " [" + bindaddress + ":" + port + "] started."); } @@ -96,9 +99,11 @@ try { serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(expectedAddress, expectedPort)); + bindFailed = false; start(); } catch (BindException bex){ - JOptionPane.showMessageDialog(null, "ポート "+expectedPort+" とバインドアドレス "+expectedAddress+" の組み合わせは使用されています。\n既存のサービスを停止するか、ポート番号/バインドアドレスを変更してください。", "エラー", JOptionPane.ERROR_MESSAGE); + bindFailed = true; + JOptionPane.showMessageDialog(null, getClass().getName()+" バインド失敗しました。\n\nポート "+expectedPort+" とバインドアドレス "+expectedAddress+" の組み合わせは使用されています。\n既存のサービスを停止するか、ポート番号/バインドアドレスを変更してください。", "エラー", JOptionPane.ERROR_MESSAGE); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/info/istlab/ServerTester/ServerPanel.java b/src/main/java/info/istlab/ServerTester/ServerPanel.java index bb0225d..feedd6d 100644 --- a/src/main/java/info/istlab/ServerTester/ServerPanel.java +++ b/src/main/java/info/istlab/ServerTester/ServerPanel.java @@ -25,6 +25,7 @@ JButton stopButton; Thread thread; JButton delButton; + JButton clientButton; /** * Create the panel. @@ -36,7 +37,6 @@ // remove package name name = name.substring(name.lastIndexOf('.') + 1); - JLabel lblNewLabel = new JLabel(name); add(lblNewLabel); @@ -69,7 +69,7 @@ }); add(delButton); - JButton clientButton = new JButton("Client"); + clientButton = new JButton("Client"); add(clientButton); clientButton.addActionListener(e -> { if (name.startsWith("Web")) { @@ -100,7 +100,11 @@ if (server.isClosed()) { portLabel.setText(String.valueOf(server.getExpectedPort())); addressLabel.setText(server.getExpectedAddress()); - statusLabel.setText("Closed (Bind Failed?)"); + if (server.bindFailed) { + statusLabel.setText("Closed (Bind失敗)"); + } else { + statusLabel.setText("Closed"); + } stopButton.setText("Restart"); delButton.setEnabled(true); } else if (server.thread != null) { @@ -110,7 +114,8 @@ stopButton.setText("Stop"); delButton.setEnabled(false); } - + clientButton.setEnabled(server.serverSocket.getInetAddress() != null); + try { Thread.sleep(2000); } catch (InterruptedException e) { @@ -123,29 +128,29 @@ super.paintComponent(g); Color color1 = Color.yellow; Color color2 = Color.orange; - if (server.isClosed()){ + if (server.isClosed()) { - } else if (server.thread != null){ + } else if (server.thread != null) { color1 = Color.cyan; - color2 = new Color(100,100,255); + color2 = new Color(100, 100, 255); } - // Graphics2D オブジェクトを取得 + // Graphics2D オブジェクトを取得 Graphics2D g2d = (Graphics2D) g; - + // パネルの幅と高さを取得 int width = getWidth(); int height = getHeight(); - + // グラデーションを設定(左上から右下にかけて) - GradientPaint gradientPaint = new GradientPaint(width/4, 0, color1, width, height, color2); - + GradientPaint gradientPaint = new GradientPaint(width / 4, 0, color1, width, height, color2); + // グラデーションで塗りつぶす g2d.setPaint(gradientPaint); g2d.fillRect(0, 0, width, height); g2d.setColor(Color.lightGray); - g2d.drawRect(0,0,width-1,height-1); + g2d.drawRect(0, 0, width - 1, height - 1); } }