88 lines
2.6 KiB
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;
|
|
}
|
|
|
|
|
|
}
|