Я пишу приложение ping, которое измеряет время возврата/отправки пакетов между двумя компьютерами (A и B). Он измеряет A-> B-> A время, A-> B время и B-> A время. Теперь я столкнулся с некоторыми проблемами при вычислении среднего времени для B-> A, он показывает отрицательные значения. Компьютер B имеет «более быстрое»/большее время, чем компьютер A при приеме пакета. Я принимаю значение времени, используя свой собственный класс:java System.currenttimemillis() имеет смещение между двумя компьютерами
public class TimingClass {
public static long getTime() {
return System.currentTimeMillis();
}
}
Выход приложения на стороне клиента выглядит следующим образом:
Time of start: 1483531410095 // Time when the packet was sent from the client
Time on B: 1483531410538 // Time taken on the server and appended to the message
Packet arrival time: 1483531410104 // Time taken when the packet arrived back on the client
13:03:21: Total=272 Rate=30/s Lost=0 AvgRTT=35ms MaxRTT=63 A->B=449 B->A=-414
Теперь вы можете увидеть, что клиент показывает меньшее значение времени когда сообщение было возвращено с сервера, чем время, затраченное на сервер.
Вот код клиент/сервер, только те части, которые ПРИЕМ/отправка сообщений:
// This is the sender thread on the client sending 30msgs/s
msgHandler.writeMessage(createMessage());
private String createMessage() {
long time = TimingClass.getTime();
String timeStr = Long.toString(time);
String message = "payload";
messageId++;
return messageId + "%" + timeStr + "-" + message;
}
// This is the server part running on the main thread
while ((msg = msgHandler.readMessage()) != null) {
catcherTime = TimingClass.getTime();
System.out.println("Message arrived: " + msg);
msgHandler.writeMessage(appendTime(msg, catcherTime));
}
// This is the receiving thread on the client side
while ((line = messageIO.readMessage()) != null) {
currentTime = TimingClass.getTime();
diff = currentTime - initTime;
messageAcc++;
numberOfMsgs++;
bufferElement.addListElement(currentTime, line);
if (diff > 1000) {
initTime = TimingClass.getTime();
bufferElement.setMsgAcc(messageAcc);
bufferElement.setMsgNumber(numberOfMsgs);
queue.put((bufferElement));
numberOfMsgs = 0;
bufferElement = new BufferQueueElement();
}
}
Из кода, напечатанные значения соответствуют указанным выше временных переменных следующим образом:
time -> Time of start
catcherTime -> Time on B
currentTime -> Packet arrival time
Клиент обрабатывает сообщения через каждые 1 с. Итак, есть ли у кого-нибудь какие-либо эксперименты с подобной проблемой или они знают, как обходить ее или решать?
P.S. Я пробовал использовать System.nanoTime()
, но тогда среднее время A-> B показывает отрицательные значения. Кроме того, на одной машине работает Windows 10 (клиент), другой Windows 8.1 (сервер), и они подключены через домашнюю сеть. Минимальная версия Java, которую я разрабатываю, равна 5, обе машины имеют java 8. Также обе машины синхронизируются с time.windows.com, я сделал это вручную перед запуском приложения, чтобы убедиться, что они синхронизированы.
Может ли это быть связано с ведущим вторым, которое мы «получаем» на прошлой неделе? У вас есть точно такая же версия java на обеих машинах? –