Hey,
ich habe mal ein kleines Programm geschrieben welches zu einer bestimmten Zeit auf eine bestimmte Fläche klicken soll.
Das Programm funktioniert, soweit so gut. Jedoch habe ich Abweichungen von bis zu 110 Millisekunden, was relativ viel ist (für den Zweck den das Programm erfüllen soll).
Ich habe den Delay meines Pings zu den jeweiligen Server implementiert, wodurch die Server Anfrage abgedeckt werden soll. Ich habe den Delay und die Abweichung von dem Zeit Server, welcher benutzt wird, implementiert. (Die Abweichung von meiner Uhr bzw der Java Uhr zu der Uhr des Zeit Servers).
Natürlich die Delays und Abweichungen zusammengerechnet und dieser Wert wird dann von dem Klick Zeitpunkt abgezogen.
Hat jemand Tipps oder Vorschläge wie man die Abweichungen so kurz wie nur irgendwie möglich machen kann?
PS: Bitte nicht wundern ich habe hier als Beispiel Google angepingt deswegen kann der Zeit Server eventuell nicht stimmen. Der Zeit Server meines eigentlichen "Ziels" ist aber pool.ntp.org.
ich habe mal ein kleines Programm geschrieben welches zu einer bestimmten Zeit auf eine bestimmte Fläche klicken soll.
Das Programm funktioniert, soweit so gut. Jedoch habe ich Abweichungen von bis zu 110 Millisekunden, was relativ viel ist (für den Zweck den das Programm erfüllen soll).
Ich habe den Delay meines Pings zu den jeweiligen Server implementiert, wodurch die Server Anfrage abgedeckt werden soll. Ich habe den Delay und die Abweichung von dem Zeit Server, welcher benutzt wird, implementiert. (Die Abweichung von meiner Uhr bzw der Java Uhr zu der Uhr des Zeit Servers).
Natürlich die Delays und Abweichungen zusammengerechnet und dieser Wert wird dann von dem Klick Zeitpunkt abgezogen.
Hat jemand Tipps oder Vorschläge wie man die Abweichungen so kurz wie nur irgendwie möglich machen kann?
Code:
package Timen;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;
public class timeclick {
//The task which you want to execute
private static class MyTimeTask extends TimerTask
{
public void run()
{
Robot bot;
try {
bot = new Robot();
bot.mouseMove(611, 529);
bot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
bot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
} catch (AWTException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args)throws Exception {
// create the ping command as a list of strings
timeclick ping = new timeclick();
List<String> commands = new ArrayList<String>();
commands.add("ping");
commands.add("111.222.33.4");
double latencyToServer=ping.doCommand(commands);
NTPUDPClient client = new NTPUDPClient();
client.open();
// use host name or IP address of target NTP server
InetAddress hostAddr = InetAddress.getByName("pool.ntp.org");
TimeInfo info = client.getTime(hostAddr);
info.computeDetails(); // compute offset/delay if not already done
Long offsetValue = info.getOffset();
Long delayValue = info.getDelay();
String delay = (delayValue == null) ? "N/A" : delayValue.toString();
String offset = (offsetValue == null) ? "N/A" : offsetValue.toString();
System.out.println(" Roundtrip delay(ms)=" + delay
+ ", clock offset(ms)=" + offset); // offset in ms
client.close();
//convert String into int
int latencyToServer1 = (int)latencyToServer;
int delayUhr=Integer.parseInt(delay);
int uhrOffset = Integer.parseInt(offset);
int allDelays= latencyToServer1+delayUhr+uhrOffset;
System.out.println("Alle Unterschiede: "+allDelays);
//the Date and time at which you want to execute
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date date;
try {
date = dateFormatter.parse("2020-08-28 23:51:50.000");
System.out.println ("aktuelle zeit " + dateFormatter.format(date));
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date);
calendar1.add(Calendar.MILLISECOND, -allDelays);
date = calendar1.getTime();
System.out.println ("neue zeit " + dateFormatter.format(date));
//Now create the time and schedule it
Timer timer = new Timer();
//Use this if you want to execute it once
timer.schedule(new MyTimeTask(), date);
//Use this if you want to execute it repeatedly
//int period = 10000;//10secs
//timer.schedule(new MyTimeTask(), date, period );
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public double doCommand(List<String> command)
throws IOException
{
String s = null;
ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
Process process1 = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stdInput1 = new BufferedReader(new InputStreamReader(process1.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
// read the output from the command
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null)
{
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null)
{
System.out.println(s);
}
//get the average latency
System.out.println("here is the average latency :\n");
double latency = 0.0;
while ((s = stdInput1.readLine()) != null)
{
if (s.contains("Mittelwert")) {
String timeWithValue = s.split(" = ")[2];
String value = timeWithValue.split("ms")[0];
latency = Double.parseDouble(value);
System.out.println("latency " + latency);
}
}
return latency;
}
}
PS: Bitte nicht wundern ich habe hier als Beispiel Google angepingt deswegen kann der Zeit Server eventuell nicht stimmen. Der Zeit Server meines eigentlichen "Ziels" ist aber pool.ntp.org.