package jnet.server.probe; import io.netty.util.HashedWheelTimer; import io.netty.util.Timeout; import io.netty.util.TimerTask; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.concurrent.TimeUnit; import jnet.lib.LogFile; import jnet.lib.Status; import jnet.lib.object.MapObject; import jnet.server.Server; public class NettyPing extends Thread { private static final HashedWheelTimer TIMER = new HashedWheelTimer(); // Netty časovač public NettyPing() { } @Override public void start() { LogFile.printInfo("Ping probe start"); for (MapObject mapObject : Server.mapObject) { schedulePing(mapObject); } } private static void schedulePing(MapObject object) { TIMER.newTimeout(new TimerTask() { @Override public void run(Timeout timeout) { pingHost(object); timeout.timer().newTimeout(this, 3, TimeUnit.SECONDS); // Opakuje každých 5 sekund } }, 0, TimeUnit.SECONDS); } private static void pingHost(MapObject object) { try { String command = System.getProperty("os.name").startsWith("Windows") ? "ping -n 1 " + object.getIp() : "ping -c 1 " + object.getIp(); Process process = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; boolean success = false; int timeMs = -1; while ((line = reader.readLine()) != null) { if (line.contains("TTL=") || line.contains("bytes from")) { success = true; timeMs = extractTime(line); } } //System.out.println("Ping na " + object.getIp() + (success ? " uspesny! RTT: " + timeMs + " ms" : " selhal!")); if (object.getStatus() != Status.OK) { PingResult.stateOnline(object); } process.waitFor(); } catch (Exception e) { System.err.println("Chyba pri pingu na " + object.getIp()); PingResult.stateOffline(object); //e.printStackTrace(); } } private static int extractTime(String line) { String[] parts = line.split(" "); for (String part : parts) { if (part.contains("time=") || part.contains("čas=")) { return Integer.parseInt(part.replaceAll("[^0-9]", "")); } } return -1; } }