Quelles sont les bonnes sources pour étudier l'implémentation en thread d'une application XMPP?

StackOverflow https://stackoverflow.com/questions/107772

  •  01-07-2019
  •  | 
  •  

Question

D'après ce que j'ai compris, le protocole XMPP est basé sur une connexion permanente, sans indication immédiate de la fin d'un message XML.

Cela signifie que vous devez évaluer le flux au fur et à mesure. Cela signifie également que vous devez probablement traiter avec des connexions asynchrones car le socket peut bloquer au milieu d'un message XML, en raison de la longueur du message ou du ralentissement de la connexion.

J'apprécierais une source par réponse afin que nous puissions les modifier et voir quel est le favori.

Était-ce utile?

La solution

Voulez-vous gérer plusieurs connexions à la fois? Un bon traitement de socket asynchrone est indispensable dans ce cas, pour éviter un thread par connexion.

Sinon, vous avez simplement besoin d’un analyseur XML capable de traiter plusieurs octets à la fois. Expat est l'exemple canonique. Si vous utilisez Java, essayez XP . Ces types d’analyseurs XML déclenchent des événements dans la mesure du possible et mettent en tampon des strophes partielles jusqu’à ce que le reste arrive.

Maintenant, pour répondre à votre assertion selon laquelle il n'y a pas de notification à la fin d'une strophe , ce n'est pas vraiment vrai. L'important est de ne pas traiter le flux XML comme s'il s'agissait d'une séquence de documents. Utilisez le pseudo-code suivant:

stanza = null
while parser has more:
  switch on token type:
     START_TAG:
       elem =  create element from parser state
       if stanza is not null:
         add elem as child of stanza
       stanza = elem
     END_TAG:
       parent = parent of stanza
       if parent is not null:
         fire OnStanza event
       stanza = parent

Cette approche devrait fonctionner avec un analyseur extrait ou basé sur les événements. Il suffit de s’en tenir à un seul pointeur d’état. De toute évidence, vous devrez également gérer les attributs, les données de caractère, les références d'entité (telles que & amp; etc.), et la balise stream: stream à des fins particulières, mais cela devrait vous aider à démarrer.

Autres conseils

Igniterealtime.org fournit un serveur et un client XMPP open source écrits en java

ejabberd est écrit en Erlang. Je ne connais pas les détails de la mise en œuvre de ejabberd, mais l'un des avantages d'utiliser Erlang est que les threads sont vraiment peu coûteux. Je vais spéculer sur le démarrage d'un thread par connexion XMPP. Dans la terminologie Erlang, ces processus s’appelleraient des processus, mais ce ne sont pas des espaces d’adresses de mémoire protégées, ce sont des threads d’espace utilisateur légers.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top