0

Nous construisons un salon de discussion avec notre propre système de notification sans dépendre de GCM mais avec service worker + SSE. Sur le bureau, c'est bien, mais sur mobile application Android (qui utilise cordova-crosswalk, chrome 53). La connexion de notification longue durée est bloquée après 20-30 minutes et se trouve dans l'activité de premier plan. Il ne meurt pas avec une erreur, mais il ne reçoit pas de données. Aucune erreur du tout ce qui est très bizarre. Pas moyen de se reconnecter puisque nous ne savons pas si la connexion est morte du tout.Chrome sur Android: connexion devenue morte après 30 minutes

Quelle serait la manière la plus propre? Redémarrer la connexion toutes les 5 minutes est une idée mais elle n'est pas propre. Code

runEvtSource(url, fn) { 
if (this.get('session.content.isAuthenticated') === true) { 
    var evtSource = new EventSource(url, { 
    withCredentials: true 
    }); 
}} 

Agressive Reconnect Code

var evtSource = this.runEvtSource(url, fn) 
var evtSourceErrorHandler = (event) => { 
    var txt; 
    switch (event.target.readyState) { 
    case EventSource.CONNECTING: 
     txt = 'Reconnecting...'; 
     evtSource.onerror = evtSourceErrorHandler; 
     break; 
    case EventSource.CLOSED: 
     txt = 'Reinitializing...'; 
     evtSource = this.runEvtSource(url, fn) 
     evtSource.onerror = evtSourceErrorHandler; 
     break; 
    } 
    console.log(txt); 
evtSource.onerror = evtSourceErrorHandler 
+0

Avez-vous essayé périodiquement (moins que le délai d'expiration auquel vous semblez) envoyer des données pour maintenir la connexion active? – gzost

+0

non je n'ai pas essayé cela, cela signifie l'envoi de fausses données? –

+1

Pas vraiment des données "fausses", mais des données qui ont pour seul but de maintenir la connexion en vie (souvent appelée ping/pong). – gzost

Répondre

1

ajouter normalement une couche de keep-alive au-dessus de la connexion SSE. Cela n'arrive pas souvent, mais les supports peuvent mourir sans mourir correctement, donc votre connexion se tait et vous n'obtenez pas d'erreur.

Ainsi, d'une façon est, à l'intérieur de votre fonction Obtenir des données:

if(timer)clearTimeout(timer); 
timer = setTimeout(reconnect, 30 * 1000); 
...process the data 

En d'autres termes, si elle est de plus de 30 secondes depuis que vous avez données dernière, reconnectez-vous. Choisissez une valeur basée sur la fréquence des données que vous envoyez: si 10% du temps il y a un intervalle de 60 secondes entre les événements de données, mais jamais un intervalle de 120 secondes, il est logique de régler le délai à plus de 120 secondes .

Vous pouvez également garder les choses en vie en transmettant des messages réguliers du serveur au client. C'est une bonne idée si la fréquence des messages du serveur est très irrégulière. Par exemple. Je peux demander au serveur d'envoyer l'horodatage actuel toutes les 30 secondes et d'utiliser un délai d'attente de 45 secondes sur le client. En outre, s'il s'agit d'une application mobile, gardez à l'esprit si l'utilisateur appréciera le bénéfice de la latence réduite de la réception de messages de chat contre les inconvénients de la réduction de la durée de vie de la batterie.

+0

Lorsque j'inspecte, la connexion est toujours active mais les données ne viennent pas ou ne vont pas. Est-ce dû à des «douilles peuvent mourir sans mourir correctement» en chrome pour mobile Android? Je veux analyser profondément cela. tout événement de déconnexion ou événement d'erreur a été reconnecté en raison d'une tentative de reconnexion agressive. juste la connexion qui se tait sans laisser d'erreur. –

+1

@PhyoArkarLwin Oui, voilà à quoi ressemble le problème. Par exemple. l'un des routeurs entre votre client et votre serveur a décidé d'abandonner la connexion (dans le cas du mobile, peut-être simplement parce qu'il est ouvert depuis longtemps), s'est écrasé ou a été redémarré. –

+0

Code de reconnexion agressif mis à jour. Pour la décision du routeur de déconnecter ce code corrige - il essaye de se reconnecter chaque fois que le problème de réseau apparaît, j'ai testé avec un ISP spécifique qui déconnecte la connexion longue durée peut-être e ou websocket, après 2-3 minutes. 'dans le cas de mobile, peut-être simplement parce qu'il a été ouvert depuis longtemps' je suppose que c'est le cas réel –