Quais são as boas fontes para estudar a implementação de encadeamento de um aplicativo XMPP?

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Do meu entendimento, o protocolo XMPP é baseado em uma conexão sempre ativa, onde você não tem, indicação imediata, quando uma mensagem XML termina.

Isso significa que você precisa avaliar o fluxo conforme ele. Isso também significa que, provavelmente, você deve lidar com conexões assíncronas, pois o soquete pode bloquear no meio de uma mensagem XML, devido ao comprimento da mensagem ou de uma conexão lenta.

Eu apreciaria uma fonte por resposta para que possamos modificá -los e ver qual é o favorito.

Foi útil?

Solução

Você está querendo lidar com várias conexões de uma só vez? Bom processamento de soquete de assíncrona é essencial nesse caso, para evitar um thread por conexão.

Caso contrário, você só precisa de um analisador XML que possa lidar com um pedaço de bytes por vez. Expat é o exemplo canônico; Se você estiver em java, tente XP. Esses tipos de analisadores XML dispararão os eventos possível e bufferm estrofes parciais até que o restante chegue.

Agora, para abordar sua afirmação de que não há notificação quando um estrofe termina, isso não é realmente verdade. O importante é não processar o fluxo XML como se fosse uma sequência de documentos. Use o seguinte pseudo-código:

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

Essa abordagem deve funcionar com um analisador baseado em eventos ou puxador. Requer apenas manter um ponteiro no estado. Obviamente, você também precisará lidar com atributos, dados de caracteres, referências de entidade (como & e similares) e o uso especial da tag Stream: Stream, mas isso deve iniciar.

Outras dicas

IgniterEalTime.org fornece um XMPP-Server e cliente escrito em java em java

Ejabberd está escrito em Erlang. Não sei os detalhes da implementação de Ejabberd, mas uma vantagem de usar o Erlang é realmente tópicos baratos. Vou especular que eles iniciem um encadeamento por conexão XMPP. Na terminologia Erlang, esses seriam chamados de processos, mas esses não são espaços de endereço de memória protegida. Eles são threads leves no espaço do usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top