Quali sono le buone fonti per studiare l'implementazione del threading di un'applicazione XMPP?

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

  •  01-07-2019
  •  | 
  •  

Domanda

Da quanto ho capito, il protocollo XMPP si basa su una connessione sempre attiva in cui non si ha alcuna indicazione immediata della fine di un messaggio XML.

Questo significa che devi valutare lo stream così com'è. Ciò significa anche che, probabilmente, devi gestire le connessioni asincrone poiché il socket può bloccarsi nel mezzo di un messaggio XML, a causa della lunghezza del messaggio o di una connessione lenta.

Gradirei una fonte per risposta in modo da poterle modificare e vedere qual è il preferito.

È stato utile?

Soluzione

Desideri gestire più connessioni contemporaneamente? In questo caso è indispensabile una buona elaborazione dei socket asincroni, per evitare un thread per connessione.

Altrimenti, hai solo bisogno di un parser XML in grado di gestire una porzione di byte alla volta. Expat è l'esempio canonico; se sei in Java, prova XP . Questi tipi di parser XML generano eventi il ??più possibile e bufferano stanze parziali fino a quando non arriva il resto.

Ora, per rispondere alla tua affermazione che non c'è nessuna notifica quando finisce una stanza , non è proprio vero. L'importante è non elaborare il flusso XML come se fosse una sequenza di documenti. Usa il seguente pseudo-codice:

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

Questo approccio dovrebbe funzionare con un parser basato su eventi o pull. Richiede solo di aggrapparsi a un puntatore degno di stato. Ovviamente, dovrai anche gestire gli attributi, i dati dei personaggi, i riferimenti alle entità (come & amp; amp; e simili) e lo stream: tag stream per scopi speciali, ma questo dovrebbe iniziare.

Altri suggerimenti

Igniterealtime.org fornisce un server XMPP e un client open source scritti in Java

ejabberd è scritto in Erlang. Non conosco i dettagli dell'implementazione di ejabberd, ma uno dei vantaggi dell'utilizzo di Erlang sono i thread davvero economici. Immagino che avviino un thread per connessione XMPP. Nella terminologia di Erlang questi verrebbero chiamati processi, ma non si tratta di spazi di indirizzi di memoria protetti ma di thread di spazi utente leggeri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top