У меня есть игра, в которой пользователи должны отвечать на вопросы с интервалом в 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 шарами, в которую я играю много, имеет игру в реальном времени между двумя пользователями, и время синхронизируется между обоими пользователями (в реальном времени), я заметил, что сетевое отставание также сильно влияет на игру.