Каковы хорошие источники для изучения многопоточной реализации приложения XMPP? - PullRequest
2 голосов
/ 20 сентября 2008

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

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

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

Ответы [ 3 ]

1 голос
/ 21 сентября 2008

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

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

Теперь, чтобы ответить на ваше утверждение об отсутствии уведомления о завершении строфы , это не совсем так. Важно не обрабатывать поток 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

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

0 голосов
/ 20 сентября 2008

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

0 голосов
/ 20 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...