Panduan untuk XMPP Smack Client

1. Pengenalan

XMPP adalah protokol pesanan segera yang kaya dan kompleks.

Daripada menulis pelanggan kita sendiri dari awal, dalam tutorial ini, kita akan melihat Smack, klien XMPP sumber terbuka modular dan mudah alih yang ditulis di Java yang telah banyak melakukan pengurangan berat bagi kita.

2. Kebergantungan

Smack diatur sebagai beberapa modul untuk memberikan lebih banyak fleksibiliti , jadi kami dapat memasukkan fitur yang kami perlukan dengan mudah.

Beberapa di antaranya termasuk:

  • XMPP melalui modul TCP
  • Modul untuk menyokong banyak peluasan yang ditentukan oleh XMPP Standards Foundation
  • Sokongan sambungan lama
  • Modul untuk disahpepijat

Kami dapat menemui semua modul yang disokong dalam dokumentasi XMPP.

Walau bagaimanapun, 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 boleh didapati di Maven Central.

3. Persediaan

Untuk menguji klien, kami memerlukan pelayan XMPP. Untuk melakukannya, kami akan membuat akaun di jabber.hot-chilli.net, perkhidmatan Jabber / XMPP percuma untuk semua orang.

Selepas itu, kita dapat mengkonfigurasi Smack menggunakan kelas XMPPTCPConnectionConfiguration yang menyediakan pembangun untuk mengatur parameter sambungan:

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

Pembina membolehkan kami menetapkan maklumat asas yang diperlukan untuk melakukan sambungan . Sekiranya diperlukan, kami juga dapat menetapkan parameter lain seperti port, protokol SSL, dan timeout.

4. Sambungan

Membuat sambungan hanya dapat dicapai dengan menggunakan kelas sambungan XMPPTCPC :

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

Kelas mengandungi konstruktor yang menerima konfigurasi yang dibina sebelumnya. Ia juga menyediakan kaedah untuk menyambung ke pelayan dan log masuk.

Setelah sambungan dibuat, kami dapat menggunakan ciri-ciri Smack , seperti sembang , yang akan kami jelaskan di bahagian seterusnya.

Sekiranya sambungan tiba-tiba terputus, secara lalai, Smack akan cuba menyambung semula.

The ReconnectionManager akan cuba untuk segera menyambung semula ke pelayan dan meningkatkan kelewatan antara percubaan sebagai penyambungan semula berturut-turut terus gagal.

5. Berbual

Salah satu ciri utama perpustakaan adalah - sokongan sembang.

Menggunakan kelas Sembang memungkinkan untuk membuat utas mesej baru antara dua pengguna:

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

Perhatikan bahawa, untuk membina sebuah Chat kita menggunakan ChatManager dan, jelas, yang dinyatakan yang berbual. Kami mencapai yang terakhir dengan menggunakan objek EntityBareJid , yangmembungkus alamat XMPP —aka a JID - yang terdiri daripada bahagian tempatan ( baeldung2 ) dan bahagian domain ( jabb3r.org ).

Selepas itu, kita dapat menghantar mesej menggunakan kaedah kirim () :

chat.send("Hello!");

Dan terima mesej dengan menetapkan 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. Bilik

Serta sembang pengguna akhir ke ujung, Smack memberikan sokongan untuk sembang kumpulan melalui penggunaan bilik .

Terdapat dua jenis bilik, bilik segera, dan bilik simpanan.

Bilik segera tersedia untuk akses segera dan dibuat secara automatik berdasarkan beberapa konfigurasi lalai. Sebaliknya, bilik yang dikhaskan dikonfigurasikan secara manual oleh pemilik bilik sebelum sesiapa sahaja dibenarkan masuk.

Mari lihat bagaimana membuat bilik segera menggunakan MultiUserChatManager :

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

Dengan cara yang serupa, kita dapat membuat bilik simpanan:

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

6. Jadual

Satu lagi ciri yang disediakan oleh Smack adalah kemungkinan untuk mengesan kehadiran pengguna lain.

Dengan Roster.getInstanceFor (), kita dapat memperoleh contoh Roster :

Roster roster = Roster.getInstanceFor(connection);

The Roster adalah senarai kenalan yang mewakili pengguna sebagai RosterEntry objek dan membolehkan kita untuk menganjurkan pengguna ke dalam kumpulan.

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 boleh menggunakan pengendali penapis logik ( AndFilter , OrFilter , NotFilter ) untuk membuat penapis kompleks:

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

8. Kesimpulannya

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

Kami belajar bagaimana mengkonfigurasi perpustakaan agar dapat mengirim dan menerima stanza XMPP.

Selepas itu, kami belajar bagaimana mengendalikan sembang kumpulan menggunakan ciri ChatManager dan Roster .

Seperti biasa, semua sampel kod yang ditunjukkan dalam tutorial ini terdapat di GitHub.