Panduan untuk XMPP Smack Client

1. Perkenalan

XMPP adalah protokol perpesanan instan yang kaya dan kompleks.

Alih-alih menulis klien kita sendiri dari awal, dalam tutorial ini, kita akan melihat Smack, klien XMPP open source modular dan portabel yang ditulis di Java yang telah melakukan banyak pekerjaan berat bagi kita.

2. Dependensi

Smack diatur sebagai beberapa modul untuk memberikan lebih banyak fleksibilitas , sehingga kita dapat dengan mudah memasukkan fitur yang kita butuhkan.

Beberapa di antaranya adalah:

  • XMPP melalui modul TCP
  • Sebuah modul untuk mendukung banyak ekstensi yang ditentukan oleh XMPP Standards Foundation
  • Dukungan ekstensi lama
  • Modul untuk di-debug

Kami dapat menemukan semua modul yang didukung dalam dokumentasi XMPP.

Namun, dalam tutorial ini, kita hanya akan menggunakan modul tcp , im , extensions , dan java7 :

 org.igniterealtime.smack smack-tcp   org.igniterealtime.smack smack-im   org.igniterealtime.smack smack-extensions   org.igniterealtime.smack smack-java7 

Versi terbaru dapat ditemukan di Maven Central.

3. Penyiapan

Untuk menguji klien, kita membutuhkan server XMPP. Untuk melakukannya, kami akan membuat akun di jabber.hot-chilli.net, layanan Jabber / XMPP gratis untuk semua orang.

Setelah itu, kita dapat mengonfigurasi Smack menggunakan kelas XMPPTCPConnectionConfiguration yang menyediakan pembuat untuk menyiapkan parameter koneksi:

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setUsernameAndPassword("baeldung","baeldung") .setXmppDomain("jabb3r.org") .setHost("jabb3r.org") .build();

Builder memungkinkan kita mengatur informasi dasar yang diperlukan untuk melakukan koneksi . Jika perlu, kami juga dapat mengatur parameter lain seperti port, protokol SSL, dan waktu tunggu.

4. Koneksi

Membuat koneksi dapat dilakukan dengan mudah menggunakan kelas XMPPTCPConnection :

AbstractXMPPConnection connection = new XMPPTCPConnection(config); connection.connect(); //Establishes a connection to the server connection.login(); //Logs in 

Kelas berisi konstruktor yang menerima konfigurasi yang dibuat sebelumnya. Ini juga menyediakan metode untuk terhubung ke server dan masuk.

Setelah koneksi dibuat, kita dapat menggunakan fitur Smack , seperti obrolan , yang akan kami jelaskan di bagian selanjutnya.

Jika koneksi tiba-tiba terputus, secara default, Smack akan mencoba menghubungkan kembali.

The ReconnectionManager akan mencoba untuk segera menyambung kembali ke server dan meningkatkan penundaan antara upaya sebagai reconnections berturut-turut tetap gagal.

5. Obrolan

Salah satu fitur utama perpustakaan adalah - dukungan obrolan.

Menggunakan kelas Obrolan memungkinkan untuk membuat utas pesan baru antara dua pengguna:

ChatManager chatManager = ChatManager.getInstanceFor(connection); EntityBareJid jid = JidCreate.entityBareFrom("[email protected]"); Chat chat = chatManager.chatWith(jid);

Perhatikan bahwa, untuk membangun Obrolan kami menggunakan ChatManager dan, jelas, menentukan dengan siapa untuk mengobrol. Kami mencapai yang terakhir dengan menggunakan objek EntityBareJid , yaitumembungkus alamat XMPP —aka JID — terdiri dari bagian lokal ( baeldung2 ) dan bagian domain ( jabb3r.org ).

Setelah itu, kita bisa mengirim pesan menggunakan metode send () :

chat.send("Hello!");

Dan terima pesan dengan mengatur pendengar:

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. Kamar

Selain obrolan pengguna ujung-ke-ujung, Smack menyediakan dukungan untuk obrolan grup melalui penggunaan ruangan .

There are two types of rooms, instant rooms, and reserved rooms.

Instant rooms are available for immediate access and are automatically created based on some default configuration. On the other hand, reserved rooms are manually configured by the room owner before anyone is allowed to enter.

Let's have a look at how to create an instant room using MultiUserChatManager:

MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection); MultiUserChat muc = manager.getMultiUserChat(jid); Resourcepart room = Resourcepart.from("baeldung_room"); muc.create(room).makeInstant();

In a similar fashion we can create a reserved room:

Set owners = JidUtil.jidSetFrom( new String[] { "[email protected]", "[email protected]" }); muc.create(room) .getConfigFormManger() .setRoomOwners(owners) .submitConfigurationForm();

6. Roster

Another feature that Smack provides is the possibility to track the presence of other users.

With Roster.getInstanceFor(), we can obtain a Roster instance:

Roster roster = Roster.getInstanceFor(connection);

The Roster is a contact list that represents the users as RosterEntry objects and allows us to organize users into groups.

We can print all entries in the Roster using the getEntries() method:

Collection entries = roster.getEntries(); for (RosterEntry entry : entries) { System.out.println(entry); }

Moreover, it allows us to listen for changes in its entries and presence data with a RosterListener:

roster.addRosterListener(new RosterListener() { public void entriesAdded(Collection addresses) { // 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 } });

It also provides a way to protect user's privacy by making sure that only approved users are able to subscribe to a roster. To do so, Smack implements a permissions-based model.

There are three ways to handle presence subscription requests with the Roster.setSubscriptionMode() method:

  • Roster.SubscriptionMode.accept_all – Accept all subscription requests
  • Roster.SubscriptionMode.reject_all – Reject all subscription requests
  • Roster.SubscriptionMode.manual – Process presence subscription requests manually

If we choose to handle subscription requests manually, we'll need to register a StanzaListener (described in next section) and handle packets with the Presence.Type.subscribe type.

7. Stanza

In addition to the chat, Smack provides a flexible framework to send a stanza and listen for incoming one.

To clarify, a stanza is a discrete semantic unit of meaning in XMPP. It is structured information that is sent from one entity to another over an XML stream.

We can transmit a Stanza through a Connection using the send() method:

Stanza presence = new Presence(Presence.Type.subscribe); connection.sendStanza(presence);

In the example above, we sent a Presence stanza to subscribe to a roster.

On the other hand, to process the incoming stanzas, the library provides two constructs:

  • StanzaCollector
  • StanzaListener

In particular, StanzaCollector let us wait synchronously for new stanzas:

StanzaCollector collector = connection.createStanzaCollector(StanzaTypeFilter.MESSAGE); Stanza stanza = collector.nextResult();

While StanzaListener is an interface for asynchronously notifying us of incoming stanzas:

connection.addAsyncStanzaListener(new StanzaListener() { public void processStanza(Stanza stanza) throws SmackException.NotConnectedException,InterruptedException, SmackException.NotLoggedInException { // handle stanza } }, StanzaTypeFilter.MESSAGE);

7.1. Filters

Moreover, the library provides a built-in set of filters to process incoming stanzas.

We can filter stanza by type using StanzaTypeFilter or by ID with StanzaIdFilter:

StanzaFilter messageFilter = StanzaTypeFilter.MESSAGE; StanzaFilter idFilter = new StanzaIdFilter("123456");

Or, discerning by particular address:

StanzaFilter fromFilter = FromMatchesFilter.create(JidCreate.from("[email protected]")); StanzaFilter toFilter = ToMatchesFilter.create(JidCreate.from("[email protected]"));

Dan kita dapat menggunakan operator filter logis ( AndFilter , OrFilter , NotFilter ) untuk membuat filter yang kompleks:

StanzaFilter filter = new AndFilter(StanzaTypeFilter.Message, FromMatchesFilter.create("[email protected]"));

8. Kesimpulan

Pada artikel ini, kami membahas kelas paling berguna yang disediakan Smack.

Kami belajar cara mengkonfigurasi perpustakaan untuk mengirim dan menerima stanza XMPP.

Selanjutnya, kami mempelajari cara menangani obrolan grup menggunakan fitur ChatManager dan Roster .

Seperti biasa, semua contoh kode yang ditampilkan dalam tutorial ini tersedia di GitHub.