diff --git a/pom.xml b/pom.xml index 3475725..35beb9f 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,12 @@ Java-WebSocket 1.5.7 + + + org.slf4j + slf4j-nop + 2.0.16 + diff --git a/src/main/java/info/istlab/ServerTester/AddPanel.java b/src/main/java/info/istlab/ServerTester/AddPanel.java index a15efa2..ac6f0f0 100644 --- a/src/main/java/info/istlab/ServerTester/AddPanel.java +++ b/src/main/java/info/istlab/ServerTester/AddPanel.java @@ -27,15 +27,20 @@ String[] options = { "WebServer", "TimeServer", "ThreadTimeServer", "EchoServer", "ThreadEchoServer", "WhiteBoardServer", "SimpleWebSocketServer" }; + int[] defaultPorts = { 8081, 10123, 11123, 10008, 11008, 11111, 8887 }; servBox = new JComboBox(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.setAllowsInvalid(false); format.setCommitsOnValidEdit(true); portSpinner.setEditor(editor); add(portSpinner); diff --git a/src/main/java/info/istlab/ServerTester/App.java b/src/main/java/info/istlab/ServerTester/App.java index b1df7db..7a0236a 100644 --- a/src/main/java/info/istlab/ServerTester/App.java +++ b/src/main/java/info/istlab/ServerTester/App.java @@ -19,23 +19,27 @@ 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)); TimeServer time = new TimeServer(); myhost.addPanel(new ServerPanel(time, myhost)); - ThreadTimeServer time2 = new ThreadTimeServer(10999); + ThreadTimeServer time2 = new ThreadTimeServer(); myhost.addPanel(new ServerPanel(time2, myhost)); - EchoServer echo = new EchoServer(10008); + EchoServer echo = new EchoServer(); myhost.addPanel(new ServerPanel(echo, myhost)); - ThreadEchoServer techo = new ThreadEchoServer(10018); + ThreadEchoServer techo = new ThreadEchoServer(); myhost.addPanel(new ServerPanel(techo, myhost)); WhiteBoardServer wb = new WhiteBoardServer(11111, "0.0.0.0"); myhost.addPanel(new ServerPanel(wb, myhost)); + SimpleWebSocketServer ws = new SimpleWebSocketServer(8887, "0.0.0.0"); + myhost.addPanel(new ServerPanel4WS(ws, myhost)); + + // 近隣のホスト情報を集めるUDPサーバ + myhost.setUdpServer(new UDPServer(54320)); } } diff --git a/src/main/java/info/istlab/ServerTester/Host.java b/src/main/java/info/istlab/ServerTester/Host.java index 6b0b48c..e4442bd 100644 --- a/src/main/java/info/istlab/ServerTester/Host.java +++ b/src/main/java/info/istlab/ServerTester/Host.java @@ -14,10 +14,10 @@ public static Host mainhost; public JPanel mainPanel; - public UDPServer server; + public UDPServer udpServer; public Host() { - setTitle("サーバー管理ウィンドウ"); + setTitle("サーバ管理ウィンドウ"); setSize(300, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); @@ -25,13 +25,17 @@ mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); add(mainPanel); - + JPanel addPanel = new AddPanel(this); addPanel.setBorder(BorderFactory.createTitledBorder("Start New Server (Class, Port, Bind address)")); add(addPanel, BorderLayout.NORTH); mainhost = this; - server = new UDPServer(); + // udpServer = new UDPServer(); + } + + public void setUdpServer(UDPServer udpServer) { + this.udpServer = udpServer; } private void setupMenu() { @@ -40,27 +44,35 @@ JMenu menu = new JMenu("Menu"); menuBar.add(menu); - JMenu channel = new JMenu("班の番号を選択"); + JMenu channel = new JMenu("班の番号を選択(UDPサーバの再起動)"); menu.add(channel); - for(int i = 1; i <= 6; i++) { + for (int i = 0; i <= 9; i++) { JMenuItem item = new JMenuItem(String.valueOf(i)); channel.add(item); item.addActionListener(e -> { System.out.println("班の番号: " + item.getText()); - server = new UDPServer(54320 + Integer.parseInt(item.getText())); // 54320 + 班の番号 のポート番号で待つ + if (udpServer != null) { + udpServer.stop(); + try { + Thread.sleep(1000); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } + udpServer = new UDPServer(54320 + Integer.parseInt(item.getText())); // 54320 + 班の番号 のポート番号で待つ }); } JMenuItem sendItem = new JMenuItem("このホストのサーバ情報をブロードキャストで送信"); menu.add(sendItem); sendItem.addActionListener(e -> { - new UDPClient(mainPanel, server.port); + new UDPClient(mainPanel, udpServer.port); }); JMenuItem showItem = new JMenuItem("近隣ホストのサーバ情報を表示"); menu.add(showItem); showItem.addActionListener(e -> { - server.openWindow(); + udpServer.openWindow(); }); menu.addSeparator(); diff --git a/src/main/java/info/istlab/ServerTester/JExecutor.java b/src/main/java/info/istlab/ServerTester/JExecutor.java index 4575bdd..2f1a6f4 100644 --- a/src/main/java/info/istlab/ServerTester/JExecutor.java +++ b/src/main/java/info/istlab/ServerTester/JExecutor.java @@ -72,7 +72,7 @@ } // ProcessBuilder processBuilder = new ProcessBuilder("pwd"); File dir = new File(App.userdir + "/target/classes"); - System.out.println(dir.getAbsolutePath()); + System.out.println("[JExecutor] chdir to "+dir.getAbsolutePath()); processBuilder.directory(dir); // processBuilder.inheritIO(); try { diff --git a/src/main/java/info/istlab/ServerTester/Server.java b/src/main/java/info/istlab/ServerTester/Server.java index 748ca68..c94f0cf 100644 --- a/src/main/java/info/istlab/ServerTester/Server.java +++ b/src/main/java/info/istlab/ServerTester/Server.java @@ -40,7 +40,7 @@ bindFailed = false; } catch (BindException bex){ bindFailed = true; - JOptionPane.showMessageDialog(null, getClass().getName()+" バインド失敗しました。\n\nポート "+expectedPort+" とバインドアドレス "+expectedAddress+" の組み合わせは使用されています。\n既存のサービスを停止するか、ポート番号/バインドアドレスを変更してください。", "エラー", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(Host.mainhost, getClass().getName()+" 起動時に、サーバソケットのバインドに失敗しました。\n\nポート "+expectedPort+" とバインドアドレス "+expectedAddress+" の組み合わせは使用されています。\n既存のサービスを停止するか、ポート番号/バインドアドレスを変更してください。", "エラー", JOptionPane.ERROR_MESSAGE); } catch (IOException e) { System.err.println(e); // System.err.println("バインド失敗。ポート番号 " + port + " (Bind-address: " + bindaddress + " 向け) がすでにつかわれているようです"); @@ -103,7 +103,7 @@ start(); } catch (BindException bex){ bindFailed = true; - JOptionPane.showMessageDialog(null, getClass().getName()+" バインド失敗しました。\n\nポート "+expectedPort+" とバインドアドレス "+expectedAddress+" の組み合わせは使用されています。\n既存のサービスを停止するか、ポート番号/バインドアドレスを変更してください。", "エラー", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(Host.mainhost, getClass().getName()+" 起動時に、サーバソケットのバインド失敗しました。\n\nポート "+expectedPort+" とバインドアドレス "+expectedAddress+" の組み合わせは使用されています。\n既存のサービスを停止するか、ポート番号/バインドアドレスを変更してください。", "エラー", JOptionPane.ERROR_MESSAGE); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/info/istlab/ServerTester/ServerPanel4WS.java b/src/main/java/info/istlab/ServerTester/ServerPanel4WS.java index 87e07f7..2d24062 100644 --- a/src/main/java/info/istlab/ServerTester/ServerPanel4WS.java +++ b/src/main/java/info/istlab/ServerTester/ServerPanel4WS.java @@ -13,6 +13,9 @@ import javax.swing.JLabel; import javax.swing.JPanel; +/** + * サーバの状態を表示するパネル for SimpleWebSocketServer + */ public class ServerPanel4WS extends JPanel implements Runnable { Host host; @@ -52,6 +55,7 @@ add(stopButton); stopButton.addActionListener(e -> { if (server.isClosed()) { + server = new SimpleWebSocketServer(server.getExpectedPort(), server.getExpectedAddress()); server.start(); } else { try { diff --git a/src/main/java/info/istlab/ServerTester/SimpleWebSocketServer.java b/src/main/java/info/istlab/ServerTester/SimpleWebSocketServer.java index 108943e..af812d0 100644 --- a/src/main/java/info/istlab/ServerTester/SimpleWebSocketServer.java +++ b/src/main/java/info/istlab/ServerTester/SimpleWebSocketServer.java @@ -7,6 +7,9 @@ import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; +/** + * シンプルなWebSocketサーバ + */ public class SimpleWebSocketServer extends WebSocketServer { public static void main(String[] args) { @@ -30,7 +33,6 @@ expectedPort = port; expectedAddress = bindaddress; start(); - System.out.println("WebSocket server started on port: " + port + " " + bindaddress); } @Override @@ -63,7 +65,7 @@ @Override public void onStart() { - System.out.println("Server started successfully"); + System.out.println(getClass().getName() + " [" + expectedAddress + ":" + expectedPort + "] started."); isClosed = false; } diff --git a/src/main/java/info/istlab/ServerTester/ThreadEchoServer.java b/src/main/java/info/istlab/ServerTester/ThreadEchoServer.java index dddfba2..b127278 100644 --- a/src/main/java/info/istlab/ServerTester/ThreadEchoServer.java +++ b/src/main/java/info/istlab/ServerTester/ThreadEchoServer.java @@ -8,7 +8,7 @@ public class ThreadEchoServer extends Server { public ThreadEchoServer() { - this(10008); + this(11008); } public ThreadEchoServer(int port) { diff --git a/src/main/java/info/istlab/ServerTester/ThreadTimeServer.java b/src/main/java/info/istlab/ServerTester/ThreadTimeServer.java index 971718f..d483561 100644 --- a/src/main/java/info/istlab/ServerTester/ThreadTimeServer.java +++ b/src/main/java/info/istlab/ServerTester/ThreadTimeServer.java @@ -9,7 +9,7 @@ public class ThreadTimeServer extends Server { public ThreadTimeServer() { - this(9999); + this(11123); } public ThreadTimeServer(int port) { this(port, "127.0.0.1"); diff --git a/src/main/java/info/istlab/ServerTester/TimeServer.java b/src/main/java/info/istlab/ServerTester/TimeServer.java index 96fe99e..186264c 100644 --- a/src/main/java/info/istlab/ServerTester/TimeServer.java +++ b/src/main/java/info/istlab/ServerTester/TimeServer.java @@ -9,7 +9,7 @@ public class TimeServer extends Server{ public TimeServer(){ - this(9999); + this(10123); } public TimeServer(int port) { this(port, "127.0.0.1"); diff --git a/src/main/java/info/istlab/ServerTester/UDPClient.java b/src/main/java/info/istlab/ServerTester/UDPClient.java index 90838b8..dfc502e 100644 --- a/src/main/java/info/istlab/ServerTester/UDPClient.java +++ b/src/main/java/info/istlab/ServerTester/UDPClient.java @@ -18,6 +18,10 @@ ServerPanel sp = (ServerPanel)c; sb.append(sp.getAvailableServices()+"\n"); } + if (c instanceof ServerPanel4WS) { + ServerPanel4WS sp = (ServerPanel4WS) c; + sb.append(sp.getAvailableServices() + "\n"); + } } @@ -40,7 +44,7 @@ // メッセージを送信 socket.send(packet); - System.out.println("メッセージをサーバーに送信しました: " + message); + System.out.println("メッセージをサーバに送信しました:\n" + message); // // サーバーからの応答を受信 // byte[] buffer = new byte[1024]; diff --git a/src/main/java/info/istlab/ServerTester/UDPServer.java b/src/main/java/info/istlab/ServerTester/UDPServer.java index 0f4c659..ddb64e5 100644 --- a/src/main/java/info/istlab/ServerTester/UDPServer.java +++ b/src/main/java/info/istlab/ServerTester/UDPServer.java @@ -1,8 +1,9 @@ package info.istlab.ServerTester; -import java.io.IOException; +import java.net.BindException; import java.net.DatagramPacket; import java.net.DatagramSocket; +import java.net.SocketException; import java.util.Hashtable; import javax.swing.JOptionPane; @@ -22,34 +23,47 @@ public UDPServer() { this(54320); } + public UDPServer(int _port) { port = _port; try { // サーバーソケットを指定されたポートで作成 socket = new DatagramSocket(port); - System.out.println("[UDP] 近隣ホスト情報を集めるUDPサーバーがポート"+port+"で待機中..."); - + System.out.println("[UDP] 近隣ホストのサーバ情報を集めるUDPサーバをポート" + port + "で起動しました。"); + System.out.println(getClass().getName() + " [0.0.0.0:" + port + "] started."); + + } catch (BindException bex) { + JOptionPane.showMessageDialog(Host.mainhost, + "UDPサーバ起動時に、サーバソケットのバインドに失敗しました。\n\nポート " + port + " は使用されています。\n既存のサービスを停止するか、ポート番号を変更してください。", + "エラー", JOptionPane.ERROR_MESSAGE); } catch (Exception e) { e.printStackTrace(); } start(); } - public void start(){ - if(thread == null){ + + public void start() { + if (thread == null) { thread = new Thread(this); thread.start(); } } - public void run(){ + + public void stop() { + socket.close(); + } + + public void run() { byte[] buffer = new byte[1024]; - while(thread != null){ + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + while (thread != null) { try { // データグラムパケットを受信 - DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); - System.out.println("[UDP] "+packet.getAddress().getHostAddress() + ":" + packet.getPort() + " からデータを受信しました。"); + System.out.println( + "[UDP] " + packet.getAddress().getHostAddress() + ":" + packet.getPort() + " から以下のデータを受信しました。"); // 受信したデータを文字列に変換 String received = new String(packet.getData(), 0, packet.getLength()); @@ -59,24 +73,28 @@ // 返信メッセージを作成 // String response = "サーバーからの応答: " + received; // byte[] responseData = response.getBytes(); - // // 返信データを送信 // DatagramPacket responsePacket = new DatagramPacket( - // responseData, responseData.length, - // packet.getAddress(), packet.getPort()); + // responseData, responseData.length, + // packet.getAddress(), packet.getPort()); // socket.send(responsePacket); - - } catch (IOException e) { + } catch(SocketException sx) { + thread = null; + } catch (Exception e) { e.printStackTrace(); thread = null; + } finally { + if (socket != null) { + socket.close(); + } } } if (socket != null && !socket.isClosed()) { socket.close(); - System.out.println("[UDP] UDPサーバーを停止しました。"); } } - public void openWindow(){ + + public void openWindow() { if (receivedData.size() == 0) { JOptionPane.showMessageDialog(Host.mainhost, "受信したデータがありません。", "受信データなし", JOptionPane.WARNING_MESSAGE); return; diff --git a/src/main/java/info/istlab/ServerTester/WebServer.java b/src/main/java/info/istlab/ServerTester/WebServer.java index 007ef8d..27065b8 100644 --- a/src/main/java/info/istlab/ServerTester/WebServer.java +++ b/src/main/java/info/istlab/ServerTester/WebServer.java @@ -37,7 +37,7 @@ } File rootdir = new File(System.getProperty("user.dir")); - // boolean askDocRoot = true; // ドキュメントルートをユーザが選べるようにする + // boolean askDocRoot = true; // ドキュメントルートをユーザが選べるようにする boolean askDocRoot = false; // ドキュメントルートは固定 if (askDocRoot) { JOptionPane.showMessageDialog(null, @@ -59,12 +59,13 @@ JOptionPane.showMessageDialog(null, "ドキュメントルートを " + rootdir.getAbsolutePath() + " に設定しました。"); } else { - System.out.println("ドキュメントルートは " + rootdir.getAbsolutePath() + " です。"); + System.out.println("[Web] ドキュメントルートは " + rootdir.getAbsolutePath() + " です。起動時に変更する場合は、askDocRootをtrueにしてください。"); } File[] files = rootdir.listFiles(); + System.out.println("[Web] ドキュメントルートのファイル一覧"); for (File file : files) { - System.out.println(file.getName()); + System.out.println("[Web] " + file.getName()); } while (serverSocket.isBound()) { try { @@ -76,6 +77,7 @@ } } } + public static void main(String[] args) { invokeMain(args, "WebServer"); } @@ -159,9 +161,10 @@ + file.getName() + "\n"; } // if (filename.indexOf("/") > -1){ - // String parent = filename.substring(0, filename.lastIndexOf("/", filename.length()-1)); - // System.out.println(parent); - // content += "\n .. (Parent Directory)\n"; + // String parent = filename.substring(0, filename.lastIndexOf("/", + // filename.length()-1)); + // System.out.println(parent); + // content += "\n .. (Parent Directory)\n"; // } content += "\n"; diff --git a/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java b/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java index 57772a0..2aec809 100644 --- a/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java +++ b/src/main/java/info/istlab/ServerTester/WhiteBoardServer.java @@ -37,7 +37,7 @@ Socket socket = serverSocket.accept(); RequestHandler4WB handler = new RequestHandler4WB(this, socket); handlers.put(socket.toString(), handler); - System.out.println("connected " + socket.toString()); + System.out.println("[WB] connected " + socket.toString()); } catch (IOException e) { } } @@ -73,14 +73,14 @@ @Override public void run() { String line = null; - System.out.println("accept"); + System.out.println("[WB] accept"); try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); os = new PrintStream(socket.getOutputStream()); - System.out.println(socket.toString()); + System.out.println("[WB] "+socket.toString()); // クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す while ((line = br.readLine()) != null) { - System.out.println("(Server received) " + line.length()); + System.out.println("[WB] Server received: " + line.length()); // 自分以外のクライアントにメッセージを送信 server.publish(line, socket.toString()); @@ -89,15 +89,15 @@ // os.close(); System.out.println(e); } finally { - System.out.println("disconnected " + socket.toString()); + System.out.println("[WB] disconnected: " + socket.toString()); server.handlers.remove(socket.toString()); - System.out.println("残り handlers.size() = " + server.handlers.size()); + System.out.println("[WB] 残り handlers.size() = " + server.handlers.size()); } } public void send(String message) { os.println(message); os.flush(); - System.out.println("sent to " + socket.toString()); + System.out.println("[WB] sent to " + socket.toString()); } } \ No newline at end of file diff --git a/wschat.html b/wschat.html index 604cf4e..fa10ffa 100644 --- a/wschat.html +++ b/wschat.html @@ -4,11 +4,11 @@ - WebSocket Test + WebSocket Chat -

WebSocket Client

+

WebSocket Chat

@@ -17,8 +17,10 @@
+ \ No newline at end of file