! ?

Встречаем Extensible Messaging and Presence Protocol (XMPP)

Автор: Тим Джонс, Emulex Corp.
Опубликовано: 09.07.2010
Версия текста: 1.1

Архитектура XMPP
Адреса в XMPP
Протокол XMPP
XMPP-пример на Ruby
Применение XMPP
Многоязычный XMPP
Идем дальше

Приложения для мгновенного обмена сообщениями (Internet-пейджеры, Instant messaging, IM) пользуются заслуженной популярностью у интернет-пользователей. Они предоставляют пользователям не только средства связи в реальном времени, но также информацию о присутствии в сети (доступен, отошел от компьютера, офлайн и т.д.). Одним из самых ранних открытых IM-протоколов был Jabber, возникший как нестандартный IM-протокол в 1998 году (разработан Джереми Миллером). Будучи расширяемым протоколом, построенным на XML, Jabber быстро нашел другие применения – в качестве общего транспорта или ориентированного на обмен сообщениями программного обеспечения промежуточного слоя (message-oriented middleware, MoM). В итоге из Jabber-а вырос XMPP, стандарт обмена мгновенными сообщениями и технологии присутствия. Спецификации XMPP были опубликованы IETF как RFC 3920 и RFC 3921.

XMPP – не единственный транспортный протокол общего назначения для обмена сообщениями. Другие популярные протоколы, такие как XML-RPC и SOAP, могут предоставить эти возможности с семантикой, подобной вызову функций. Более новые методы, такие, как Representational State Transfer (ReST), предоставляют управляемый доступ к файлам с использованием URL для указания места, объекта и метода.

Архитектура XMPP

XMPP похож на другие протоколы слоя приложения, например, SMTP. В таких архитектурах клиент с уникальным именем связывается с другим клиентом с уникальным именем через ассоциированный сервер. Каждый клиент реализует клиентскую форму протокола, а сервер предоставляет возможность маршрутизации. На рисунке 1 показана такая простая архитектура. В данном случае оба клиента являются частью одного домена (discovery.nasa.guv).


Рисунок 1. Простая XMPP-архитектура, включающая сервер и двух клиентов.

Серверы также связываются между собой в целях маршрутизации между доменами (например, между discovery.nasa.guv и europa.nasa.guv). Далее, могут существовать шлюзы в целях трансляции в другие домены и протоколы мгновенного обмена сообщениями. Пример на рисунке 2 показывает XMPP-сеть со шлюзами в домены Short Message Service (SMS) и SMTP. В данном контексте шлюзы чаще всего используются для трансляции между IM-протоколами (например, XMPP в Internet Relay Chat [IRC]). Будучи расширяемым, XMPP является идеальным базовым протоколом для универсальной связи между разными конечными протоколами. XMPP-шлюз разрешает целевому конечному протоколу завершение данной сессии клиент-сервер и начало новой сессии (вместе с надлежащей трансляцией протокола).


Рисунок 2. Более сложная XMPP-архитектура, включающая XMPP-шлюзы.

Адреса в XMPP

Адреса (или Jabber IDs [JIDs]) в XMPP похожи на стандартные e-mail-адреса с парой важных различий. JID включает узел, домен и необязательный ресурс в форме:

 [ node "@" ] domain [ "/" resource ]

Наиболее часто используется определение пользователя IM (как в e-mail-адресе), например, David­Bow­man@discovery.nasa.guv. Пользователь может подключаться к XMPP-серверу несколько раз, и в этом случае ресурс может обозначать его местоположение. Например, пользователь может иметь один JID для основного терминала (DavidBowman@discovery.nasa.guv/terminal) и другой – для второстепенного (DavidBowman@disco­ve­ry.nasa.guv/eva_pod1). Это позволяет доставить сообщение пользователю именно в то место, где он выполнил вход в систему.

Протокол XMPP

XMPP – это относительно простой протокол, работающий поверх TCP-сокетов с использованием XML-сообщений. Асинхронные коммуникации выполняются в XML-потоках и XML-строфах (stanzas). XML-поток – это конверт, инкапсулирующий обмен XML-информацией между двумя сущностями. XML-потоки содержат XML-строфы, являющиеся дискретными единицами этой информации. Например, XML-строфы используются в XMPP для обмена сообщениями (текстом между пользователями Internet-пейджера) и для информирования о присутствии пользователя. Чтобы проиллюстрировать эти концепции, посмотрим на простой пример IM-связи между двумя клиентами с использованием XMPP.

На рисунке 3 показаны простые переговоры между двумя сущностями. Заметьте, что в переговорах участвует как минимум один сервер (в данном случае, поскольку оба клиента находятся в одном домене, это точно только один сервер). На рисунке 3 левый клиент – это инициирующая сущность (он инициирует XMPP-обмен между двумя сущностями). Этот XML-поток использует атрибут to для идентификации получающего домена (а также для определения пространства имен XML). Принимающий клиент справа получает XML-поток и отвечает также XML-потоком (используя атрибут from). На этом этапе возможен ряд различных переговоров, в частности, об аутентификации и шифровании. Здесь мы пропустим этот этап (как и обмен сообщениями между серверами, когда клиенты находятся в разных доменах).


Рисунок 3. Пример (упрощенный) обмена XMPP-сообщениями.

Следующий шаг в XML-потоке на рисунке 3 – это обмен сообщениями. Этот обмен происходит в XML-строфах и включает XMPP-адреса источника и приемника (from и to), используемый язык и сообщение, хранящееся в теле XML-строфы. Узел отвечает собственным сообщением, отличающимся XMPP-адресами источника и приемника. Наконец, XML-поток закрывается путем отправки закрывающего сообщения (это делается на обоих сторонах соединения).

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

<stream:error>
  <xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
<stream:error>

Хотя этот пример показывает простой обмен IM-сообщениями, просто увидеть, как строфы сообщений могут трансформироваться в RPC-сообщения. Вместо пользователей домена можно зарегистрировать в качестве узлов функции для создания динамического фреймворка Web-сервисов. Теперь посмотрим, как построить простое приложение, работающее через XMPP.

XMPP-пример на Ruby

ПРИМЕЧАНИЕ

Выбираем XMPP-библиотеку

Один из интересных аспектов XMPP – большое количество библиотек на многих языках. Этот пример написан на Ruby с использованием библиотеки XMPP4R. Ссылки на различные существующие библиотеки можно найти в разделе Ресурсы.

Чтобы продемонстрировать работу с XMPP с использованием библиотек, рассмотрим разработку простого IM-агента, используемого в качестве технического словаря. В нашем случае в стандартном Internet-пейджере вы будете набирать слово, а IM-агент будет возвращать его определение

В этом примере реализован IM-агент, подключающийся через XMPP к другому IM-агенту и, подключившись, получает определения слов:

Листинг 1. Простой XMPP-агент.
require 'xmpp4r/client'

# Создаем очень простой словарь, используя хэш-таблицу
hash = {}
hash['ruby'] = 'Greatest little object oriented scripting language'
hash['xmpp4r'] = 'Simple XMPP library for ruby'
hash['xmpp'] = 'Extensible Messaging and Presence Protocol'

# Подключаемся к серверу и аутентифицируемся
jid = Jabber::JID::new('bot@default.rs/Home')
cl = Jabber::Client::new(jid)
cl.connect
cl.auth('password')

# Обозначаем серверу свое присутствие
cl.send Jabber::Presence::new

# Посылаем приветствие другому пользователю
salutation = Jabber::Message::new( 'hal@default.rs', 'DictBot ready' )
salutation.set_type(:chat).set_id('1')
cl.send salutation 

# Добавляем метод обратного вызова для ответа на запрос другого узла
cl.add_message_callback do |in_msg|

    # Ищем слово в словаре
    resp = hash[in_msg.body]
    if resp == nil
      resp = "don't know about " + in_msg.body
    end

    # Отправляем ответ
    outmsg = Jabber::Message::new( in_msg.from, resp )
    outmsg.set_type(:chat).set_id('1')
    cl.send outmsg

end

# Run
while 1
end

Листинг 1 начинается с создания простого словаря. Для этого используется Ruby-класс hash, позволяющий создавать пары ключ-значение, а затем легко ссылаться на них по ключу. Затем для подключения к серверу используется библиотека XMPP4R. Для начала создается JID и новое клиентское соединение с помощью класса Client. Чтобы действительно подключиться к IM-серверу используется метод connect. После подключения вызывается метод auth с паролем. Теперь соединение готово к обмену сообщениями.

Следующий шаг (необязательный) – сообщить IM-серверу о своем присутствии. Для этого нужно послать соответствующую XML-строфу серверу. Можно также послать необязательное сообщение о своем присутствии другому узлу. Для этого создается строфа сообщения и инициализируется адресом узла и сообщением. После инициализации сообщения пошлите его, используя экземпляр класса Client и метод send.

Для добавления реакции на сообщения используется метод add_message_callback клиентского соединения. При поступлении сообщения вызывается блок кода, обрабатывающий сообщение. Входящее сообщение представляется переменной in_msg (типа Message). Работа начинается с проверки, содержится ли слово, определенное в теле входящего сообщения, в словаре. Если возвращается nil, слово не найдено, и возвращается ответ по умолчанию. Новое сообщение конструируется из источника входящего сообщения (in_msg.from) и строки ответа. После завершения инициализации новое сообщение отправляется адресату через экземпляр клиента.

На рисунке 4 показан пример запущенного приложения. Этот пример использует популярный универсальный клиент чата Pidgin. Клиент Pidgin поддерживает все основные протоколы чатов и может использоваться во различных существующих чат-сетях (даже одновременно). На рисунке 4 показано окно обмена сообщениями, созданное, когда IM-клиент подключился к серверу и начал общение с другим пользователем.


Рисунок 4. Пример IM-сессии.

Это приложение было чрезвычайно простым, но XMPP4R предоставляет множество классов и методов для другой функциональности, например, регистрации, обнаружения, передачи файлов, многопользовательских чатов, публикации/подписки и даже RPC. По адресу http://home.gna.org/xmpp4r/rdoc вы можете найти документацию по API, предоставленную в удобном виде.

Применение XMPP

XMPP предоставляет общий фреймворк для обмена сообщениями по сети. Неудивительно, что ему находится множество применений, кроме традиционного IM и распространения сведений о своем присутствии.

Близко к IM находится группа многостороннего обмена сообщениями или разработка многопользовательских чатов. При многостороннем обмене сообщениями можно реализовать возможности, похожие на микроблоггинг в Twitter. Но текст – это не единственный тип данных, которые можно передавать через XMPP. Другие формы коммуникации могут включать обмен изображениями, а также аудио- и видеоданными.

Протоколы обнаружения сервисов сегодня существуют (например, Bonjour или Service Location Protocol), но XMPP предоставляет солидную основу как для поиска сервисов в сети, так и для рекламы сервисов и возможностей.

Онлайн-игры также могут использовать XMPP. XMPP исходно предоставляет набор возможностей для онлайн-игр, включая аутентификацию, информацию о присутствии, чаты и расширяемый, почти в реальном времени, обмен информацией о состоянии игры.

Наконец, XMPP – это совершенный протокол для новой эры облачных вычислений. Облачные вычисления и хранилища данных используют разные уровни и формы коммуникаций, включая не только обмен сообщениями между системами для передачи состояния, но и перемещения больших объектов, таких как хранилища или виртуальные машины. Благодаря аутентификации и защите данных при передаче XMPP может применяться на разных уровнях и идеален как протокол среднего уровня.

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

Многоязычный XMPP

XMPP реализован как набор библиотек, предоставляющих приложениям возможности XMPP. Сказать, что XMPP, как протокол, очень полезен, очень просто уже исходя из количества поддерживаемых им сегодня языков. Вы можете найти XMPP-библиотеки для традиционных языков типа С и C++, а также для популярных скриптовых языков типа Ruby, Java, Python, Perl и Tcl. Существуют также XMPP-библиотеки для таких языков, как Erlang, C# и Lisp. Таким образом, какую бы среду вы не использовали, вы, скорее всего, найдете XMPP-библиотеку для нее. Полный список поддерживаемых языков можно найти в разделе Ресурсы.

Идем дальше

ПРИМЕЧАНИЕ

Растущий ReST

Хотя ReST – это больше архитектурная модель, чем реализация, он быстро развивается в различных направлениях. Его простая модель удаленного управления ресурсами нашла свое место в облачных вычислениях, где ReST используется как модель для доступа к хранилищам и управления ими.

Многие полезные технологии часто применяются так, как их изобретатели и не предполагали. Например, HTTP де-факто является стандартным протоколом для показа Web-страниц, но он также используется как транспорт уровня приложения такими протоколами как SOAP и XML-RPC (включая модели протоколов типа ReST). XMPP – еще одна полезная технология, которая находит множество применений, кроме обычного IM. Как вы примените XMPP в ваших решениях?

Ресурсы


! ?


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

Copyright 1994-2016 "-"