¿Cuáles son buenas fuentes para estudiar la implementación de subprocesos de una aplicación XMPP?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Según tengo entendido, el protocolo XMPP se basa en una conexión siempre activa en la que no se tiene ninguna indicación inmediata de cuándo finaliza un mensaje XML.

Esto significa que tienes que evaluar la transmisión tal como viene.Esto también significa que, probablemente, tenga que lidiar con conexiones asincrónicas ya que el socket puede bloquearse en medio de un mensaje XML, ya sea debido a la longitud del mensaje o a que la conexión sea lenta.

Agradecería una fuente por respuesta para que podamos modificarlas y ver cuál es la favorita.

¿Fue útil?

Solución

¿Quieres lidiar con múltiples conexiones a la vez?En ese caso, es imprescindible un buen procesamiento de sockets asíncronos para evitar un subproceso por conexión.

De lo contrario, sólo necesita un analizador XML que pueda manejar una gran cantidad de bytes a la vez. expatriado es el ejemplo canónico;si estás en Java, prueba experiencia.Estos tipos de analizadores XML activarán tantos eventos como sea posible y almacenarán en buffer estrofas parciales hasta que llegue el resto.

Ahora, para abordar su afirmación de que no hay notificación cuando un estrofa termina, eso no es realmente cierto.Lo importante es no procesar el flujo XML como si fuera una secuencia de documentos.Utilice el siguiente pseudocó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

Este enfoque debería funcionar con un analizador de extracción o basado en eventos.Solo requiere aferrarse a un indicador de estado.Obviamente, también necesitarás manejar atributos, datos de caracteres, referencias de entidades (como &y similares) y la etiqueta stream:stream con un propósito especial, pero esto debería ayudarte a comenzar.

Otros consejos

Igniterealtime.org proporciona un servidor y cliente XMPP de código abierto escrito en java

ejabberd está escrito en Erlang.No conozco los detalles de la implementación de ejabberd, pero una ventaja de usar Erlang son los subprocesos realmente económicos.Especularé que inician un hilo por conexión XMPP.En la terminología de Erlang, estos se denominarían procesos, pero no son espacios de direcciones de memoria protegida, sino subprocesos ligeros de espacio de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top