2009-12-08 6 views
1

Quel est le meilleur moyen d'envoyer des données d'un client au serveur?Envoi de messages au serveur avec une interrogation longue Comet

Le code exemple que je utilise est de How do I implement basic "Long Polling"?

+0

Cette autre question ne répond-elle pas à celle-ci? –

+0

Non - les réponses indiquent comment effectuer une longue interrogation pour obtenir des données du serveur, et non comment envoyer quelque chose * au * serveur pendant une longue interrogation. Sauf si j'ai raté quelque chose? –

Répondre

1

Oui, utilisez simplement la deuxième connexion au serveur. C'est ce que font la plupart des frameworks, y compris iirc le Bayeux protocol. Si vous trouvez que vous avez réellement besoin de cette deuxième connexion, vous inquiéter à ce sujet alors.

est ici un code long polling modifié de mon lien ci-dessus:

var userid = Math.ceil(1000000*Math.random()).toString(16).toUpperCase(); 
var startLongpoll = function() { 
    $.ajax({ 
     type:"POST", async:true, cache:false, timeout:0, 
     data: {userid: userid}, 
     success: function(data){ 
      _outCallback(data); 
      setTimeout(startLongpoll, 10); 
     }, 
     error: function(xhr, textStatus, errorThrown){ 
      _errCallback(textStatus+" ("+errorThrown+")"); 
      setTimeout(startLongpoll, 5000); 
     }, 
    }); 
}; 
setTimeout(startLongpoll,10); 

Que Moishe parlait avec la file d'attente est que js ne garantit pas que les requêtes XHR seront reçues dans l'ordre que vous les EXPEDIE . Les messages ne seront pas perdus (ou du moins ils n'ont pas été dans mes tests), et ce n'est pas un problème à interrogation longue spécifique, mais quelque chose à considérer quand vous utilisez xhr pour envoyer.

Alors, voici le code de file d'attente:

var queue = []; 
var busy = false; 
this.send = function(msg) { 
    queue[queue.length] = msg; 
    if (busy) return; 
    busy=true; 
    var s = function() { 
     var m = queue.shift(); 
     $.ajax({ 
      type:"POST", async:true, cache:false, timeout: 5000, 
      data: {userid:userid, msg:m}, 
      error: function(xhr, textStatus, errorThrown){ 
       _errCallback(textStatus + " (" + errorThrown + ")"); 
       if (queue.length>0) s(); else busy = false; 
      }, 
      success: function(){ 
       if (queue.length>0) s(); else busy = false; 
      } 
     }); 
    } 
    s(); 
}; 

Deux choses à noter. D'abord, il y a un peu de décalage si vous envoyez beaucoup de messages et que la file d'attente se remplit. Il est préférable de trouver un moyen d'envoyer la file entière à chaque fois, plutôt que morceau par morceau. Une façon de le faire est de convertir les messages dans un tableau JSON, et de décoder sur le serveur. Deuxièmement, en cas d'erreur lors de l'envoi du message, vous avez perdu le message. Il doit y avoir un peu de code qui soit repoussera le message échoué dans la file d'attente, soit ne le supprimera pas tant qu'il n'y aura pas de succès.

1

Il suffit d'utiliser XHR pour faire un POST. Un problème est sur certains navigateurs que vous ne pouvez avoir que 2 (ou un nombre n) de connexions XHR simultanées par serveur. Vous pouvez contourner ce problème en créant une file d'attente qui vous permet d'afficher tous les messages en attente à la fin du XHR en cours, puis de remplir une nouvelle file d'attente jusqu'à la fin de ce message, et d'aller et venir.

+0

L'interrogation longue peut prendre 10 secondes ou plus - c'est long à attendre pour envoyer quelque chose au serveur. Je suppose qu'un cadre populaire a déjà résolu cela - mais comment? (À droite, 2 connexions par serveur et par onglet, puisque l'un est le sondage, le second serait le serveur xhr, les images, les feuilles de style, etc ... Ceux-ci seraient mis en file d'attente.) –

+0

Vous avez besoin d'un XHR asynchrone. Ensuite, pendant que cela est en attente de terminer, vous pouvez faire un autre (asynchrone ou non, c'est à vous) XHR de publier des données sur le serveur. Si le second XHR * est * asynchrone, vous devrez mettre en place une mise en file d'attente pour ne pas perdre les messages que vous souhaitez publier pendant que le second XHR est en cours. –

+0

Je ne pense pas que vous perdiez des messages si vous envoyez un xhr asynch au-delà de la limite de 2 connexions. Voulez-vous dire faire la queue sur le serveur? –

1

L'envoi de données au serveur est simplement une requête standard. Xhr est bien, ou JSONP, tout ce qui flotte votre bateau.

Ne soyez pas dérouté par le sondage de longue durée; l'interrogation longue n'existe que comme un moyen d'envoyer du serveur au client. L'envoi de données depuis le client vers le serveur est ce que le Web a été à propos depuis sa création, et une requête Xhr normale est tout ce dont vous avez besoin.

Questions connexes