jNetServer/src/jnet/server/probe/NettyPing.java

88 lines
2.6 KiB
Java

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;
}
}