2015-04-23 3 views
4

Я разработал яваскрипт чат (PHP на внутреннем интерфейсе) с помощью:Ajax опрос чат получает дубликаты на приемнике сообщения переднего конце на скором общении

1) long-polling to get new messages for the receiver 
2) sessionStorage to store the counter of messages 
3) setInterval to read new messages and if sessionStorageCounter < setIntervalCounter then the last message is shown to receiver. 
4) javascript to create,update and write the chat dialogues 

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

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

Считаете ли вы, что приведенная выше схема является плохой практикой и какая схема, по вашему мнению, устранит ошибки?

+4

Вы всегда можете проверить DOM перед добавлением нового сообщения чата, чтобы узнать, есть ли там одно и то же сообщение. таким образом у вас не будет такого же сообщения дважды, – Robin

+1

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

+1

Вы полагаетесь на любую сторону сервера timestamps? – Muggles

ответ

5

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

  • Есть сервер присвоить уникальный идентификатор (GUID) для каждого сообщения, как она поступает.
  • На клиентах хранится идентификатор самого последнего полученного сообщения.
  • При опросе новых сообщений сделайте это с идентификатором последнего успешного сообщения. Затем сервер отвечает, находя это сообщение в своей собственной очереди и воспроизводя все последующие сообщения.
  • Чтобы защититься от «выпавших» сообщений, каждое сообщение может также нести идентификатор сразу-предыдущего сообщения (что позволяет клиенту сделать консистенцию проверки)

Если repolling действительно вызывает дубликаты должны быть доставлены с сервера для клиента наличие уникальных идентификаторов в каждом сообщении делает их тривиальными. Подумайте о очереди сообщений на стороне сервера в качестве потока событий, при этом каждый клиент отслеживает свою позицию последнего чтения. Клиент не делает никаких догадок о соответствующем порядке сообщений, о том, сколько их есть и т. Д. - потому что его состояние полностью состоит из «того, что я видел», есть несколько возможностей выйти из синхронизации.

+0

большое спасибо! –

0

Поскольку это чат реального времени, интервал setInterval, вероятно, достаточно мал, чтобы запрашивать у сервера новые сообщения два или три раза одновременно. Убедитесь, что обработчик сервера синхронизирован, и он игнорирует дублированные запросы от одного и того же пользователя.