Есть несколько способов. Тот, который предлагает Рейнос, - это неправильно. Потому что время клиента и время сервера разные, и вы не можете их сравнивать.
Решение с отправкой метки времени - это хорошо, но есть одна проблема. Если логика сервера выполняет некоторые решения и вычисления, основанные на ping, то отправка метки времени создает риск того, что клиентское программное обеспечение или MITM изменят метку времени, и это даст серверу другие результаты.
Гораздо лучшим способом является отправка пакета клиенту с уникальным идентификатором, который не является номером приращения, а рандомизирован. И тогда сервер будет ожидать от клиента сообщения «PONG» с этим идентификатором.
Размер идентификатора должен быть таким же, я рекомендую 32 бита (int).
Таким образом, сервер отправляет «PING» с уникальным идентификатором и хранит метку времени отправленного сообщения, а затем ждет, пока не получит ответ «PONG» с тем же идентификатором от клиента, и рассчитает задержку прохождения сигнала в обоих направлениях на основе сохраненной метки времени и нового один на момент получения сообщения PONG.
Не забудьте реализовать случай с тайм-аутом, чтобы предотвратить потерю пакета PING / PONG и остановить процесс проверки задержки.
Также WebSockets имеет специальный код операции пакета, называемый PING, но пример из поста выше не использует эту функцию. Прочтите этот официальный документ, который описывает этот конкретный код операции, это может быть полезно, если вы реализуете свой собственный протокол WebSockets на стороне сервера: http://tools.ietf.org/html/rfc6455#page-37