Таймер синхронизации между сервером и клиентом - узел js / android / socket io - PullRequest
0 голосов
/ 04 июля 2018

У меня есть игра, в которой пользователи должны отвечать на вопросы с интервалом в 10 секунд. Это означает, что по истечении 10 секунд пользователю не разрешается отвечать на вопрос, если он еще не ответил на него. В этот момент сервер также не должен позволять пользователю отвечать на вопрос, поскольку сервер также знает, что истекли 10 секунд.

Для достоверности и проверки того, что клиент не подвергается никаким манипуляциям, я решил установить таймер на сервере и просто отобразить таймер для клиента (отображение таймера важно).

Вопрос в том, как отобразить таймер пользователю, а также убедиться, что таймер действителен на клиенте.

Socket IO обрабатывает взаимодействие между клиентом и сервером, когда пользователь фактически играет, http обрабатывает все остальное, что пользователь делает в игре (вход в систему, регистрация, учетная запись, оплата и т. Д.).

Мой стек - android с java, сервер узла js, сокет io на обоих. Я настроил все, единственная проблема заключается в подходе к синхронизации таймера как на клиенте, так и на сервере.

Я думал, что одним из подходов может быть обслуживание вопроса и, в основном, установка переменной в сокете следующим образом (на сервере)

 var t = new Date();
 t.setSeconds(t.getSeconds() + 12); //2 seconds extra for network lag
 socket.allowed_time = t

Затем отправьте вопрос клиенту и покажите пользователю 10-секундный отсчет. Всякий раз, когда клиент отвечает, проверьте, больше ли текущее время, чем socket.allowed_time. Этот метод кажется ненадежным, учитывая сетевую задержку.

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

1 Ответ

0 голосов
/ 04 июля 2018

Я не думаю, что есть способ, который 1) справится с сетевым лагом 1 и 2) справится с клиентами притворяется есть сетевое отставание.

Если вас не волнует, что отстающий клиент / пользователь иногда наказывается, тогда вы просто запускаете 10-секундный таймер на стороне сервера. Если ответ клиента не получен до того, как таймер отключится, он будет отклонен.

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


1 - ... без "несправедливого" наказания отстающего клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...