Руководство для клиента XMPP Smack
1. Введение
XMPP является богатым и сложным протоколом обмена мгновенными сообщениями.
Вместо того, чтобы писать наш собственный клиент с нуля, в этом учебнике мы посмотрим на Smack, модульный и портативный клиент XMPP с открытым исходным кодом, написанный на Java , который сделал большую часть тяжелой работы для нас.
2. Зависимости
Smack организован как несколько модулей, чтобы обеспечить большую , так что мы можем легко включить функции, которые нам нужны.
Некоторые из них включают в себя:
- XMPP над модулем TCP
- Модуль для поддержки многих расширений, определенных Фондом стандартов XMPP
- Поддержка устаревших расширений
- Модуль для отладки
Мы можем найти все поддерживаемые модули в Документация XMPP .
Тем не менее, в этом учебнике, мы просто использовать tcp , им , расширения , и Java7 Модули:
org.igniterealtime.smack smack-tcp org.igniterealtime.smack smack-im org.igniterealtime.smack smack-extensions org.igniterealtime.smack smack-java7
Последние версии можно найти на Мавен Центральный .
3. Настройка
Для того, чтобы протестировать клиента, нам понадобится сервер XMPP. Для этого мы создадим учетную запись на jabber.hot-chilli.net , бесплатный сервис Jabber/XMPP для всех.
После этого мы можем настроить Smack с помощью XMPPTCPConnectionКонфигурация класс, который предоставляет строитель для настройки параметров соединения:
XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setUsernameAndPassword("baeldung","baeldung") .setXmppDomain("jabb3r.org") .setHost("jabb3r.org") .build();
Строитель позволяет нам установить основную информацию, необходимую для выполнения . При необходимости мы также можем установить другие параметры, такие как порт, протоколы SSL и тайм-ауты.
4. Подключение
Создание соединения просто достигается с помощью XMPPTCPConnection класс:
AbstractXMPPConnection connection = new XMPPTCPConnection(config); connection.connect(); //Establishes a connection to the server connection.login(); //Logs in
Класс содержит конструктора, который принимает ранее построенную конфигурацию. Он также предоставляет методы подключения к серверу и входа в систему.
После того, как соединение было установлено, мы можем использовать функции Smack , как чат , что мы опишем в следующем разделе.
В случае внезапного прерывания соединения, по умолчанию Smack попытается восстановить связь.
ВоссоединениеМенеджер будет пытаться немедленно подключиться к серверу и увеличить задержку между попытками, как последовательные повторного подключения держать сбой.
5. Чат
Одной из главных особенностей библиотеки является поддержка чата.
Использование Чат класс позволяет создать новый поток сообщений между двумя пользователями:
ChatManager chatManager = ChatManager.getInstanceFor(connection); EntityBareJid jid = JidCreate.entityBareFrom("[email protected]"); Chat chat = chatManager.chatWith(jid);
Обратите внимание, что для создания Чат мы использовали ЧатМенагер и, очевидно, уточнил, с кем общаться. Мы достигли последнего, используя EntityBareJid объект, который обертывания XMPP адрес ака JID- состоит из местной части ( baeldung2 ) и доменной части ( jabb3r.org ).
После этого мы можем отправить сообщение с помощью отправить () метод:
chat.send("Hello!");
И получать сообщения, установив слушателя:
chatManager.addIncomingListener(new IncomingChatMessageListener() { @Override public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) { System.out.println("New message from " + from + ": " + message.getBody()); } });
5.1. Номера
А также пользовательский чат, а также Smack обеспечивает поддержку групповых чатов с помощью номеров .
Есть два типа номеров, мгновенные номера, и зарезервированные номера.
Мгновенные номера доступны для немедленного доступа и автоматически создаются на основе некоторой конфигурации по умолчанию. С другой стороны, зарезервированные номера вручную настроены владельцем комнаты, прежде чем кому-либо будет разрешено войти.
Давайте посмотрим, как создать мгновенный номер с помощью MultiUserChatManager :
MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection); MultiUserChat muc = manager.getMultiUserChat(jid); Resourcepart room = Resourcepart.from("baeldung_room"); muc.create(room).makeInstant();
Аналогичным образом мы можем создать зарезервированную комнату:
Setowners = JidUtil.jidSetFrom( new String[] { "[email protected]g", "[email protected]" }); muc.create(room) .getConfigFormManger() .setRoomOwners(owners) .submitConfigurationForm();
6. Реестр
Еще одна функция, которую предоставляет Smack, это возможность отслеживать присутствие других пользователей.
С Состав.getInstanceFor (), мы можем получить Реестр пример:
Roster roster = Roster.getInstanceFor(connection);
тем список — это список контактов, представляющий пользователей как РеестрВентий объектов и позволяет нам организовывать пользователей в группы.
Мы можем распечатать все записи в Реестр с помощью getEntries () метод:
Collectionentries = roster.getEntries(); for (RosterEntry entry : entries) { System.out.println(entry); }
Кроме того, он позволяет нам слушать изменения в своих записях и данных о присутствии с помощью СписокЛистенер:
roster.addRosterListener(new RosterListener() { public void entriesAdded(Collectionaddresses) { // handle new entries } public void entriesDeleted(Collection addresses) { // handle deleted entries } public void entriesUpdated(Collection addresses) { // handle updated entries } public void presenceChanged(Presence presence) { // handle presence change } });
Он также предоставляет способ защиты конфиденциальности пользователя, убедившись, что только утвержденные пользователи могут подписаться на реестр. Для этого Smack реализует модель, основанную на разрешениях.
Существует три способа обработки запросов на подписку присутствия с помощью Состав.setSubscriptionMode() метод:
- Roster.SubscriptionMode.accept_all – Принять все запросы на подписку
- Roster.SubscriptionMode.reject_all – Отклонить все запросы на подписку
- Состав.SubscriptionMode.manual – Обработать запросы на подписку присутствия вручную
Если мы решили обрабатывать запросы на подписку вручную, нам нужно зарегистрировать СтрофаЛистенер (описано в следующем разделе) и обрабатывать пакеты с Присутствие.Type.subscribe тип.
7. Строфа
В дополнение к чату, Smack обеспечивает гибкую основу для отправки строфы и слушать входящий.
Чтобы прояснить, строфа является дискретной семантической единицей смысла в XMPP. Это структурированная информация, которая отправляется из одной сущности в другую через поток XML.
Мы можем передать Строфа через Связь с помощью отправить () метод:
Stanza presence = new Presence(Presence.Type.subscribe); connection.sendStanza(presence);
В приведеном выше примере мы отправили Присутствие строфы, чтобы подписаться на реестр.
С другой стороны, для обработки входящих строф библиотека предоставляет две конструкции:
- СтрофаКоллектор
- СтрофаЛистенер
В частности, СтрофаКоллектор Давайте ждать синхронно для новых строф :
StanzaCollector collector = connection.createStanzaCollector(StanzaTypeFilter.MESSAGE); Stanza stanza = collector.nextResult();
В то СтрофаЛистенер интерфейс для асинхронно уведомляя нас о входящих строфах :
connection.addAsyncStanzaListener(new StanzaListener() { public void processStanza(Stanza stanza) throws SmackException.NotConnectedException,InterruptedException, SmackException.NotLoggedInException { // handle stanza } }, StanzaTypeFilter.MESSAGE);
7.1. Фильтры
Более того, библиотека предоставляет встроенный набор фильтров для обработки входящих строф.
Мы можем фильтровать строфы по типу с помощью StanzaTypeFilter или по ID с StanzaIdFilter:
StanzaFilter messageFilter = StanzaTypeFilter.MESSAGE; StanzaFilter idFilter = new StanzaIdFilter("123456");
Или, различая по конкретному адресу:
StanzaFilter fromFilter = FromMatchesFilter.create(JidCreate.from("[email protected]")); StanzaFilter toFilter = ToMatchesFilter.create(JidCreate.from("[email protected]"));
И мы можем использовать логический оператор фильтра ( Ифильтр , OrFilter , NotFilter ) для создания сложных фильтров:
StanzaFilter filter = new AndFilter(StanzaTypeFilter.Message, FromMatchesFilter.create("[email protected]"));
8. Заключение
В этой статье мы рассмотрели наиболее полезные классы, которые Smack предоставляет с полки.
Мы научились настраивать библиотеку для отправки и получения строфы XMPP.
Впоследствии мы научились обрабатывать групповые чаты с помощью ЧатМенагер и Реестр Функции.
Как обычно, все образцы кода, показанные в этом учебнике, доступны более чем на GitHub.