dynamicke pridavani a odebirani hostu

uprava parsovani vysledku
NettyPing
Michal 2025-02-14 20:07:01 +01:00
parent 758ce624ef
commit f409ec2c08
1 changed files with 67 additions and 6 deletions

View File

@ -5,7 +5,12 @@ import io.netty.util.Timeout;
import io.netty.util.TimerTask; import io.netty.util.TimerTask;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.InputStreamReader; 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.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import jnet.lib.LogFile; import jnet.lib.LogFile;
import jnet.lib.Status; import jnet.lib.Status;
import jnet.lib.object.Map; import jnet.lib.object.Map;
@ -15,19 +20,30 @@ import jnet.server.Server;
public class NettyPing extends Thread { public class NettyPing extends Thread {
private static final HashedWheelTimer TIMER = new HashedWheelTimer(); // Netty časovač private static final HashedWheelTimer TIMER = new HashedWheelTimer(); // Netty časovač
private static final Set<MapObject> activeHosts = ConcurrentHashMap.newKeySet(); // Dynamická správa hostů
public NettyPing() { public NettyPing() {
} }
// @Override
// public void run() {
// LogFile.printInfo("Ping probe start");
// for (Map map : Server.maps) {
// for (MapObject mapObject : map.getObjects()) {
// schedulePing(mapObject);
// }
// }
// }
@Override @Override
public void run() { public void run() {
LogFile.printInfo("Ping probe start"); LogFile.printInfo("Ping probe start");
for (Map map : Server.maps) { TIMER.newTimeout(new TimerTask() {
for (MapObject mapObject : map.getObjects()) { @Override
schedulePing(mapObject); 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) { private static void schedulePing(MapObject object) {
@ -40,6 +56,40 @@ public class NettyPing extends Thread {
}, 0, TimeUnit.SECONDS); }, 0, TimeUnit.SECONDS);
} }
private static void updateHosts() {
Set<MapObject> 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) { private static void pingHost(MapObject object) {
try { try {
String command = System.getProperty("os.name").startsWith("Windows") 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(" "); String[] parts = line.split(" ");
for (String part : parts) { for (String part : parts) {
if (part.contains("time=") || part.contains("čas=")) { if (part.contains("time=") || part.contains("čas=")) {
@ -86,4 +136,15 @@ public class NettyPing extends Thread {
return -1; 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
}
} }