Как измерить время отклика сети с помощью Java?

У нас есть клиент и сервер. Я хочу измерить время отклика сети между ними. Когда я отправляю запрос на сервер, он должен немедленно ответить на мой запрос, он должен быть похож на запрос проверки связи, чтобы на сервере не было времени обработки.

Как я могу сделать это на Java?

4 ответа

Я сделал это, отправив пакет с меткой времени от клиента к серверу, а затем заставив сервер вернуть ту же метку времени назад. Когда сервер получает метку времени, он может сравнивать ее с текущей меткой времени для измерения времени прохождения туда-обратно.

По-видимому, есть способ генерировать ICMP-пинг в Java 5 и более поздних версиях. Если вы хотите измерить скорость сети, просто возьмите System.nanoTime() до и после и сравни. Обратите внимание, что если ваша программа работает с недостаточным количеством привилегированных пользователей для выполнения ping ICMP, тогда Java прибегнет к использованию эхо-запроса TCP к порту 7, который все равно будет соответствовать вашим потребностям.

Я думаю, что вам нужно различать время, затрачиваемое на сервер (компьютер), и время, которое ваш серверный процесс обрабатывает. Например, ping будет просто измерять время ответа ICMP, которое является низкоуровневым возвратом сетевого протокола. Если принять во внимание стек TCP, а затем последующую обработку сервером, этот период времени будет больше.

От вашего вопроса, это звучит как пинг (ICMP), что вы хотите. В JDK 5 и выше вы можете сделать:

String host = "192.168.0.1"
int timeOut = 5000; 
boolean status = InetAddress.getByName(host).isReachable(timeOut)

и вам нужно время, что с помощью System.nano() или похожие.

Чтобы обеспечить максимально быстрый отклик сервера, следует

  1. иметь второе подключение к другому порту - это полезно, если вы хотите проверить маршрут к серверу, то есть по проводам - ​​или
  2. общий поток для всех входящих пакетов, который решает, является ли входящий пакет запросом ping, и немедленно отвечает - что полезно, если вы хотите проверить текущее соединение (которое учитывает другие пакеты в этом соединении).

В любом случае прослушивающая часть (сервер) должна иметь свой собственный поток или обработка запроса может устареть во время обработки других пакетов.

Обратите внимание, что что бы вы ни делали для измерения скорости соединения, у вас не будет надежного значения. Тем не менее, вы должны иметь приемлемое значение, если вы берете в среднем несколько таких пингов.

Использование ping должно быть достаточно или wget для скорости передачи данных. Вы можете использовать justniffer для определения времени отклика "производственных" запущенных серверов.

Другие вопросы по тегам