2015-04-23 2 views
4

J'ai développé un chat en javascript (php sur le back-end) en utilisant:Ajax dans le chat de vote reçoit les doublons au niveau du récepteur de messages frontal sur le chat rapide

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 

Le module fonctionne très bien, mais lorsque les utilisateurs ont un rapide chat l'avant du récepteur reçoit deux ou trois mêmes messages, (ni le compteur échoue, ni la requête fournit des insertions doubles).

Le code semble être correct (c'est pourquoi je ne fournis pas le code), donc le délai d'intervalle pourrait être la raison (sur le délai d'intervalle de réduction, rien ne change).

Pensez-vous que le schéma ci-dessus est une mauvaise pratique et quel schéma pensez-vous éliminer les erreurs?

+4

Vous pouvez toujours vérifier le DOM avant d'ajouter un nouveau message de chat pour voir si le même message existe déjà ou non. De cette façon, vous n'aurez pas le même message deux fois, – Robin

+1

une autre suggestion que j'ai pour vous est que, si vous allez avoir un chat en temps réel dans votre application, pourquoi ne pas penser à aller avec le serveur et le client serveur fonctionnant sur le back end pour répondre aux besoins de l'application de chat – Robin

+1

Comptez-vous sur un serveur côté horodatage? – Muggles

Répondre

5

Mon approche, si moi-même il résoudre (par opposition à l'aide d'une bibliothèque existante qui gère déjà) serait:

  • que le serveur attribue un identifiant unique (GUID) à chaque message qu'il arrive.
  • Sur les clients, stockez l'ID du dernier message reçu.
  • Lors de l'interrogation de nouveaux messages, faites-le avec l'ID du dernier message reçu avec succès. Le serveur répond alors en trouvant ce message dans sa propre file d'attente et en rejouant tous les messages suivants.
  • Pour se prémunir contre « chuté » des messages, chaque message peut également porter l'ID du message immédiatement-précédent (ce qui permet au client de faire la cohérence vérification)

Si repolling ne provoque des doublons pour être délivrés du serveur Pour le client, la présence d'identifiants uniques sur chaque message permet de les éliminer facilement. Considérez la file d'attente des messages côté serveur comme un flux d'événements, chaque client effectuant le suivi de sa dernière position de lecture. Le client ne fait aucune supposition sur l'ordre approprié des messages, combien il y en a, etc. - parce que son état est entièrement constitué de «ce que j'ai vu», il y a peu d'opportunités de se désynchroniser.

+0

merci beaucoup! –

0

Comme il s'agit d'un chat en temps réel, l'intervalle setInterval est probablement suffisamment petit pour demander au serveur de nouveaux messages deux ou trois fois simultanément. Assurez-vous que le gestionnaire de serveur est synchronisé et qu'il ignore les requêtes en double provenant du même utilisateur.