From f409ec2c0803bc99941019a1d79a9744263552ce Mon Sep 17 00:00:00 2001 From: Michal Date: Fri, 14 Feb 2025 20:07:01 +0100 Subject: [PATCH] dynamicke pridavani a odebirani hostu uprava parsovani vysledku --- src/jnet/server/probe/NettyPing.java | 73 +++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/src/jnet/server/probe/NettyPing.java b/src/jnet/server/probe/NettyPing.java index f21b618..05a2c2c 100644 --- a/src/jnet/server/probe/NettyPing.java +++ b/src/jnet/server/probe/NettyPing.java @@ -5,7 +5,12 @@ import io.netty.util.Timeout; import io.netty.util.TimerTask; import java.io.BufferedReader; import java.io.InputStreamReader; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import jnet.lib.LogFile; import jnet.lib.Status; import jnet.lib.object.Map; @@ -15,19 +20,30 @@ import jnet.server.Server; public class NettyPing extends Thread { private static final HashedWheelTimer TIMER = new HashedWheelTimer(); // Netty časovač + private static final Set activeHosts = ConcurrentHashMap.newKeySet(); // Dynamická správa hostů public NettyPing() { } +// @Override +// public void run() { +// LogFile.printInfo("Ping probe start"); +// for (Map map : Server.maps) { +// for (MapObject mapObject : map.getObjects()) { +// schedulePing(mapObject); +// } +// } +// } @Override public void run() { LogFile.printInfo("Ping probe start"); - for (Map map : Server.maps) { - for (MapObject mapObject : map.getObjects()) { - schedulePing(mapObject); + TIMER.newTimeout(new TimerTask() { + @Override + public void run(Timeout timeout) { + updateHosts(); // Pravidelně kontroluje `Server.maps` a pinguje aktivní hosty + timeout.timer().newTimeout(this, Server.config.getInt("ping_repeat"), TimeUnit.SECONDS); } - } - + }, 0, TimeUnit.SECONDS); } private static void schedulePing(MapObject object) { @@ -40,6 +56,40 @@ public class NettyPing extends Thread { }, 0, TimeUnit.SECONDS); } + private static void updateHosts() { + Set currentHosts = new HashSet<>(); + + // Procházení všech hostů v Server.maps + for (Map map : Server.maps) { + for (MapObject object : map.getObjects()) { + if (object.isActive()) { + currentHosts.add(object); + } + } + } + + // Přidání nových hostů k monitorování + for (MapObject obj : currentHosts) { + if (activeHosts.add(obj)) { // Přidá pouze pokud tam ještě není + LogFile.printInfo("Pridan host: " + obj.getIp()); + } + } + + // Odebrání hostů, které už nejsou v Server.maps + activeHosts.removeIf(obj -> { + if (!currentHosts.contains(obj)) { + LogFile.printInfo("Odebran host: " + obj.getIp()); + return true; + } + return false; + }); + + // Ping všech aktivních hostů + for (MapObject obj : activeHosts) { + pingHost(obj); + } + } + private static void pingHost(MapObject object) { try { String command = System.getProperty("os.name").startsWith("Windows") @@ -76,7 +126,7 @@ public class NettyPing extends Thread { } } - private static int extractTime(String line) { + private static int extractTimeV1(String line) { String[] parts = line.split(" "); for (String part : parts) { if (part.contains("time=") || part.contains("čas=")) { @@ -86,4 +136,15 @@ public class NettyPing extends Thread { return -1; } + private static int extractTime(String line) { + // Regulární výrazy pro Windows i Linux formát + Pattern pattern = Pattern.compile("time[=<](\\d+)"); + Matcher matcher = pattern.matcher(line); + + if (matcher.find()) { + return Integer.parseInt(matcher.group(1)); + } + return -1; // Pokud se nepodaří najít čas + } + }