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
+
@@ -17,8 +17,10 @@
+