diff --git a/.vscode/launch.json b/.vscode/launch.json index 9d84663..c34111f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,6 +6,13 @@ "configurations": [ { "type": "java", + "name": "MainMonitor", + "request": "launch", + "mainClass": "info.istlab.ServerTester.monitor.MainMonitor", + "projectName": "KisoServerTester" + }, + { + "type": "java", "name": "ServerTesterApp", "request": "launch", "mainClass": "info.istlab.ServerTester.ServerTesterApp", diff --git a/src/main/java/info/istlab/ServerTester/App.java b/src/main/java/info/istlab/ServerTester/App.java index 85958d7..cce5be3 100644 --- a/src/main/java/info/istlab/ServerTester/App.java +++ b/src/main/java/info/istlab/ServerTester/App.java @@ -20,6 +20,16 @@ userdir = System.getProperty("user.dir"); } + public static void networkSelect(){ + // ネットワークインタフェースの調査と選択 + primaryInterface = NetworkInterfaceSelector.getPrimaryInterface(); + if (primaryInterface == null) { + System.out.println("ネットワークインタフェースが見つかりませんでした。"); + System.exit(1); + } + primaryInetAddr = NetworkInterfaceSelector.getPrimaryInetAddr(primaryInterface); + } + public static void main(String[] args) { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override @@ -33,13 +43,8 @@ String location = clazz.getProtectionDomain().getCodeSource().getLocation().getPath(); isJAR = location.endsWith(".jar"); - // ネットワークインタフェースの調査と選択 - primaryInterface = NetworkInterfaceSelector.getPrimaryInterface(); - if (primaryInterface == null) { - System.out.println("ネットワークインタフェースが見つかりませんでした。"); - System.exit(1); - } - primaryInetAddr = NetworkInterfaceSelector.getPrimaryInetAddr(primaryInterface); + networkSelect(); + Host myhost = new Host(); diff --git a/src/main/java/info/istlab/ServerTester/monitor/MainMonitor.java b/src/main/java/info/istlab/ServerTester/monitor/MainMonitor.java new file mode 100644 index 0000000..d5cd792 --- /dev/null +++ b/src/main/java/info/istlab/ServerTester/monitor/MainMonitor.java @@ -0,0 +1,32 @@ +package info.istlab.ServerTester.monitor; + +import java.util.ArrayList; + +import info.istlab.ServerTester.App; + +public class MainMonitor { + + ArrayList monitors = new ArrayList(); + + public static void main(String[] args) { + App.networkSelect(); + new MainMonitor(); + } + + public MainMonitor() { + for (int i = 0; i < 10; i++) { + monitors.add(new MulticastMonitor(54320 + i, this)); + } + } + + public void processReceivedData(int channel, String addr, String message) { + // System.out.println("Received from " + addr + ": " + message); + String[] lines = message.split("\n"); + for (String line : lines) { + if (line.indexOf("WebServer") > -1 && line.indexOf("127.0.0.1") == -1 + && line.indexOf("Running") > -1) { + System.out.println(" " + line + " " + addr + " " + channel); + } + } + } +} diff --git a/src/main/java/info/istlab/ServerTester/monitor/MulticastMonitor.java b/src/main/java/info/istlab/ServerTester/monitor/MulticastMonitor.java new file mode 100644 index 0000000..d42ea2e --- /dev/null +++ b/src/main/java/info/istlab/ServerTester/monitor/MulticastMonitor.java @@ -0,0 +1,91 @@ +package info.istlab.ServerTester.monitor; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.StandardProtocolFamily; +import java.nio.ByteBuffer; +import java.nio.channels.AsynchronousCloseException; +import java.nio.channels.DatagramChannel; +import java.util.Hashtable; + +import info.istlab.ServerTester.App; +import info.istlab.ServerTester.MulticastSender; +import info.istlab.ServerTester.RemoteHostsWindow; + +public class MulticastMonitor implements Runnable { + Thread thread; + // MulticastSocket socket; + MulticastSender sender; + RemoteHostsWindow remoteHostsWindow; + DatagramChannel channel; + + // 受信したデータを IP アドレスをキーにして保存 + Hashtable receivedData = new Hashtable(); + MainMonitor mainMonitor; + int portNum; + + public MulticastMonitor(int portNum, MainMonitor mainMonitor) { + this.mainMonitor = mainMonitor; + this.portNum = portNum; + try { + // socket = new MulticastSocket(portNum); + InetAddress group = InetAddress.getByName("224.0.0.1"); + + try { + channel = DatagramChannel.open(StandardProtocolFamily.INET); + channel.bind(new InetSocketAddress(portNum)); + channel.join(group, App.primaryInterface); + } catch (IOException e) { + e.printStackTrace(); + } + // socket.joinGroup(group); + } catch (IOException e) { + e.printStackTrace(); + } + thread = new Thread(this); + thread.start(); + } + + public void run() { + ByteBuffer buffer = ByteBuffer.allocate(1024); + while (thread != null) { + buffer.clear(); + InetSocketAddress senderAddr = null; + try { + senderAddr = (InetSocketAddress) channel.receive(buffer); + } catch(AsynchronousCloseException ace){ + thread = null; + break; + } catch (IOException e) { + e.printStackTrace(); + } + buffer.flip(); + + byte[] data = new byte[buffer.remaining()]; + buffer.get(data); + String message = new String(data); + if (senderAddr == null) { + thread = null; + break; + } + String addr = senderAddr.getAddress().getHostAddress(); + receivedData.put(addr, message); + if (mainMonitor != null) { + mainMonitor.processReceivedData(portNum - 54320, addr, message); + } + } + } + + public void stop() { + try { + channel.close(); + } catch (IOException e) { + e.printStackTrace(); + } + // socket.close(); + sender.stop(); + // thread = null; + } + +}