diff --git a/src/main/java/info/istlab/ServerTester/Host.java b/src/main/java/info/istlab/ServerTester/Host.java index 1fe3b54..6c4d322 100644 --- a/src/main/java/info/istlab/ServerTester/Host.java +++ b/src/main/java/info/istlab/ServerTester/Host.java @@ -42,6 +42,14 @@ new UDPClient(mainPanel); }); + JMenuItem showItem = new JMenuItem("近隣ホストのサーバ情報を表示"); + menu.add(showItem); + showItem.addActionListener(e -> { + UDPServer.instance.openWindow(); + }); + + menu.addSeparator(); + JMenuItem exitItem = new JMenuItem("Exit"); menu.add(exitItem); exitItem.addActionListener(e -> { diff --git a/src/main/java/info/istlab/ServerTester/NeighborsHostsWindow.java b/src/main/java/info/istlab/ServerTester/NeighborsHostsWindow.java new file mode 100644 index 0000000..f8c6bf9 --- /dev/null +++ b/src/main/java/info/istlab/ServerTester/NeighborsHostsWindow.java @@ -0,0 +1,99 @@ +package info.istlab.ServerTester; + +import java.awt.Color; +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Hashtable; +import java.util.Iterator; + +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; + +public class NeighborsHostsWindow extends JPanel { + + public NeighborsHostsWindow(Hashtable receivedData) { + JFrame frame = new JFrame(); + frame.setTitle("Neighbors Hosts"); + frame.setSize(300, 200); + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + + JTabbedPane tabbedPane = new JTabbedPane(); + frame.getContentPane().add(tabbedPane); + Iterator it = receivedData.keySet().iterator(); + while (it.hasNext()) { + String key = it.next(); + String value = receivedData.get(key); + tabbedPane.add(key, new NeighborHost(key, value)); + } + + frame.pack(); + frame.setVisible(true); + } +} + +class NeighborHost extends JPanel { + String hostip; + + public NeighborHost(String _hostip, String value) { + hostip = _hostip; + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + // System.out.println(value); + String[] servers = value.split("\n"); + for (String server : servers) { + // ex: WebServer 8081 127.0.0.1 Running + String[] info = server.split(" "); + // System.out.println(server); + JPanel panel = new JPanel(); + panel.add(new JLabel(info[0])); + panel.add(new JLabel(info[1])); + JLabel addressLabel = new JLabel(info[2]); + if (info[2].equals("127.0.0.1")) { + addressLabel.setForeground(Color.red); + } + panel.add(addressLabel); + panel.add(new JLabel(info[3])); + JButton button = new JButton("Connect"); + panel.add(button); + if (info[3].equals("Running")) { + button.setEnabled(true); + } else { + button.setEnabled(false); + } + button.addActionListener(e -> { + // もしbind addressが0.0.0.0だったら、hostipを使う + String target = info[2]; + if (target.equals("0.0.0.0")) { + target = hostip; + } + if (target.equals("127.0.0.1")) { + target = hostip; + } + if (info[0].startsWith("Web")) { + // open web browser + Desktop desktop = Desktop.getDesktop(); + try { + desktop.browse(new URI("http://" + target + ":" + info[1])); + } catch (IOException | URISyntaxException e1) { + } + } else if (info[0].startsWith("Echo") || info[0].startsWith("ThreadEcho")) { + new JExecutor("EchoClient", info[1] + " " + target); + // new EchoClient(info[1], target); + } else if (info[0].startsWith("Time") || info[0].startsWith("ThreadTime")) { + new JExecutor("TimeClient", info[1] + " " + target); + // new TimeClient(info[1], target); + } else if (info[0].startsWith("WhiteBoard")) { + new JExecutor("WhiteBoardClient", info[1] + " " + target); + // new WhiteBoardClient(info[1], target); + } + }); + add(panel); + } + } + +} \ No newline at end of file diff --git a/src/main/java/info/istlab/ServerTester/UDPClient.java b/src/main/java/info/istlab/ServerTester/UDPClient.java index a7dfbd2..16384c0 100644 --- a/src/main/java/info/istlab/ServerTester/UDPClient.java +++ b/src/main/java/info/istlab/ServerTester/UDPClient.java @@ -42,14 +42,14 @@ socket.send(packet); System.out.println("メッセージをサーバーに送信しました: " + message); - // サーバーからの応答を受信 - byte[] buffer = new byte[1024]; - DatagramPacket responsePacket = new DatagramPacket(buffer, buffer.length); - socket.receive(responsePacket); + // // サーバーからの応答を受信 + // byte[] buffer = new byte[1024]; + // DatagramPacket responsePacket = new DatagramPacket(buffer, buffer.length); + // socket.receive(responsePacket); - // 受信したデータを文字列に変換 - String response = new String(responsePacket.getData(), 0, responsePacket.getLength()); - System.out.println("サーバーからの応答: " + response); + // // 受信したデータを文字列に変換 + // String response = new String(responsePacket.getData(), 0, responsePacket.getLength()); + // System.out.println("サーバーからの応答: " + response); } catch (Exception e) { e.printStackTrace(); } finally { diff --git a/src/main/java/info/istlab/ServerTester/UDPServer.java b/src/main/java/info/istlab/ServerTester/UDPServer.java index e3d3de6..445570b 100644 --- a/src/main/java/info/istlab/ServerTester/UDPServer.java +++ b/src/main/java/info/istlab/ServerTester/UDPServer.java @@ -3,11 +3,16 @@ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; +import java.util.Hashtable; public class UDPServer implements Runnable { + public static UDPServer instance; Thread thread; DatagramSocket socket = null; + // 受信したデータを IP アドレスをキーにして保存 + Hashtable receivedData = new Hashtable(); + public static void main(String[] args) { new UDPServer(); } @@ -25,6 +30,7 @@ } catch (Exception e) { e.printStackTrace(); } + instance = this; } public void start(){ if(thread == null){ @@ -44,17 +50,18 @@ // 受信したデータを文字列に変換 String received = new String(packet.getData(), 0, packet.getLength()); - System.out.println("[UDP] 受信したメッセージ: " + received); + receivedData.put(packet.getAddress().getHostAddress(), received); + System.out.println(received); // 返信メッセージを作成 - String response = "サーバーからの応答: " + received; - byte[] responseData = response.getBytes(); + // String response = "サーバーからの応答: " + received; + // byte[] responseData = response.getBytes(); - // 返信データを送信 - DatagramPacket responsePacket = new DatagramPacket( - responseData, responseData.length, - packet.getAddress(), packet.getPort()); - socket.send(responsePacket); + // // 返信データを送信 + // DatagramPacket responsePacket = new DatagramPacket( + // responseData, responseData.length, + // packet.getAddress(), packet.getPort()); + // socket.send(responsePacket); } catch (IOException e) { e.printStackTrace(); @@ -66,4 +73,7 @@ System.out.println("[UDP] UDPサーバーを停止しました。"); } } + public void openWindow(){ + new NeighborsHostsWindow(receivedData); + } }