Каковы хорошие источники для изучения потоковой реализации приложения XMPP?

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

  •  01-07-2019
  •  | 
  •  

Вопрос

Насколько я понимаю, протокол XMPP основан на постоянно включенном соединении, при котором у вас нет немедленного указания того, когда заканчивается XML-сообщение.

Это означает, что вы должны оценивать поток по мере его поступления.Это также означает, что, вероятно, вам придется иметь дело с асинхронными соединениями, поскольку сокет может блокироваться в середине XML-сообщения либо из-за длины сообщения, либо из-за медленного соединения.

Я был бы признателен за один источник для каждого ответа, чтобы мы могли доработать их и посмотреть, какой из них самый любимый.

Это было полезно?

Решение

Вы хотите иметь дело с несколькими подключениями одновременно?В этом случае необходима хорошая асинхронная обработка сокетов, чтобы избежать использования одного потока на соединение.

В противном случае вам просто нужен анализатор XML, который может обрабатывать несколько байтов за раз. Эмигрант это канонический пример;если вы работаете на Java, попробуйте ХР.Эти типы анализаторов XML будут запускать события, насколько это возможно, и буферизовать частичные строки до тех пор, пока не поступят остальные.

Теперь обратимся к вашему утверждению о том, что нет уведомления, когда stanza в конце концов, на самом деле это не так.Важно не обрабатывать XML-поток так, как если бы это была последовательность документов.Используйте следующий псевдокод:

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

Этот подход должен работать с анализатором событий или извлечением данных.Для этого требуется только удерживать значение состояния одного указателя.Очевидно, вам также нужно будет обрабатывать атрибуты, символьные данные, ссылки на сущности (например &и тому подобное), и специальный тег stream:stream, но это должно помочь вам начать.

Другие советы

Igniterealtime.org предоставляет XMPP-сервер и клиент с открытым исходным кодом, написанные на java

эджабберд написано на эрланге.Я не знаю подробностей реализации ejabberd, но одним из преимуществ использования Erlang являются действительно недорогие потоки.Я предположу, что они запускают поток для каждого XMPP-соединения.В терминологии Erlang это называлось бы процессами, но это не защищенные адресные пространства памяти, это облегченные потоки пользовательского пространства.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top