xmpp: асинхронная обработка входящих сообщений

#xmpp

#xmpp

Вопрос:

Я пытаюсь написать реализацию XMPP-клиента (без чуши, прямое TCP-соединение).

пытаясь выяснить, как обрабатывать входящие сообщения в ответ на мои собственные запросы и узнать, какой ответ относится к какому запросу, большинство протоколов помечают запрос некоторым уникальным идентификатором, и сервер отправляет этот идентификатор вместе с ответом.

Я видел параметры ID для IQ stanzas, но сообщается, что они идентифицируют сеанс, а не уникальное сообщение…

каков наилучший способ решения этой проблемы?

Комментарии:

1. XMPP — это хорошо зарекомендовавший себя протокол. Почему бы не использовать библиотеку? xmpp.org/xmpp-software/libraries

2. Я, strophe.js но я внес коррективы, чтобы он работал на платформе на основе js без bosh, используя прямой tcp, поэтому мне нужно внести некоторые изменения, и возникла эта проблема..

Ответ №1:

Атрибут ID в строках IQ привязывает запрос (get или set) к ответу (результату или ошибке). Для каждого запроса следует использовать новый идентификатор. Это способ отслеживать ответы на каждый запрос.

Комментарии:

1. помню, что в RFC я читал, что атрибут ID относится к сеансу, а не к предварительному сообщению, я неправильно понял?

2. Атрибут ID указывается для каждой строки (сообщения), а не для каждого сеанса

Ответ №2:

В новом RFC 6120 содержится хорошее описание того, как работают IQS. Убедитесь, что вы сопоставляете отправителя и идентификатор полученной строки, чтобы кто-то другой не угадал ваши идентификационные номера. Типичным шаблоном является использование IQtracker, который вы вызываете следующим образом (псевдокод):

 iq = create_xml_dom_that_is(<iq id='[counter  ]' type='get' to='receiver'/>)
track(iq, callback)
  

где обратный вызов вызывается, когда мы получаем строку iq от получателя с ожидаемым идентификатором, или когда достигнут некоторый промежуток времени без получения ответа.