parent
758ce624ef
commit
f409ec2c08
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue