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 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<MapObject> 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<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) {
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
}
}