מדריך ללקוח XMPP Smack

1. הקדמה

XMPP הוא פרוטוקול העברת הודעות מיידיות עשיר ומורכב.

במקום לכתוב את הלקוח שלנו מאפס, במדריך זה, נסתכל על Smack, לקוח XMPP קוד פתוח מודולרי ונייד שנכתב בג'אווה שעשה הרבה מההרמת הכבד עבורנו.

2. תלות

סמאק מאורגן כמספר מודולים כדי לספק גמישות רבה יותר, כך שנוכל לכלול בקלות את התכונות הדרושות לנו.

חלקם כוללים:

  • מודול XMPP מעל TCP
  • מודול התומך ברבים מההרחבות שהוגדרו על ידי קרן התקנים XMPP
  • תמיכה בתוספות מדור קודם
  • מודול לניפוי באגים

אנו יכולים למצוא את כל המודולים הנתמכים בתיעוד של XMPP.

עם זאת, במדריך זה, פשוט נשתמש ב- tcp, im, הרחבות, ו java7 מודולים:

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

ניתן למצוא את הגרסאות האחרונות ב- Maven Central.

3. התקנה

על מנת לבדוק את הלקוח, נצטרך שרת XMPP. לשם כך, ניצור חשבון ב- jabber.hot-chilli.net, שירות Jabber / XMPP בחינם לכולם.

לאחר מכן, אנו יכולים להגדיר את סמאק באמצעות XMPPTCPConnectionConfiguration מחלקה המספקת בונה להגדיר את פרמטרי החיבור:

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

הבנאי מאפשר לנו להגדיר את המידע הבסיסי הדרוש לביצוע חיבור. במידת הצורך, אנו יכולים גם להגדיר פרמטרים אחרים כגון יציאה, פרוטוקולי SSL ופסקי זמן.

4. חיבור

יצירת חיבור מושגת פשוט באמצעות חיבור XMPPTCP מעמד:

תקציר חיבור XMPP חיבור = XMPPTCP חיבור חדש (תצורה); connection.connect (); // יוצר חיבור לחיבור השרת.לוגין (); // נכנס 

הכיתה מכילה קונסטרוקטור שמקבל את התצורה שנבנתה בעבר. הוא גם מספק שיטות להתחברות לשרת ולהתחברות.

לאחר שנוצר חיבור, נוכל להשתמש בתכונות של סמאק, כמו לְשׂוֹחֵחַ, אותו נתאר בחלק הבא.

במקרה שהקשר נקטע פתאום, כברירת מחדל, סמאק ינסה להתחבר מחדש.

ה ReconnectionManager ינסה להתחבר מחדש מיד לשרת ולהגדיל את העיכוב בין ניסיונות מכיוון שחיבורים חוזרים רצופים ממשיכים להיכשל.

5. צ'אט

אחד המאפיינים העיקריים של הספרייה הוא - תמיכה בצ'אט.

משתמש ב לְשׂוֹחֵחַ בכיתה מאפשר ליצור שרשור הודעות חדש בין שני משתמשים:

ChatManager chatManager = ChatManager.getInstanceFor (חיבור); EntityBareJid jid = JidCreate.entityBareFrom ("[מוגן באמצעות הדוא"ל]"); צ'אט צ'אט = chatManager.chatWith (jid);

שים לב שכדי לבנות א לְשׂוֹחֵחַ השתמשנו ב- ChatManager וברור שציין עם מי לשוחח. השגנו את האחרון באמצעות EntityBareJid אובייקט, אשרעוטף כתובת XMPP - כמו JID - מורכב מחלק מקומי (baeldung2) וחלק מתחום (jabb3r.org).

לאחר מכן, אנו יכולים לשלוח הודעה באמצעות לִשְׁלוֹחַ() שיטה:

chat.send ("שלום!");

וקבל הודעות על ידי הגדרת מאזין:

chatManager.addIncomingListener (חדש IncomingChatMessageListener () {@Override public void newIncomingMessage (EntityBareJid from, Message message, Chat chat) {System.out.println ("הודעה חדשה מ-" + מ- + ":" + message.getBody ()); }});

5.1. חדרים

כמו גם צ'אט של משתמשים מקצה לקצה, סמאק מספק תמיכה בצ'אטים קבוצתיים באמצעות שימוש בחדרים.

ישנם שני סוגים של חדרים, חדרים מיידיים וחדרים שמורים.

חדרים מיידיים זמינים לגישה מיידית ונוצרים אוטומטית על פי תצורת ברירת מחדל כלשהי. מצד שני, חדרים שמורים מוגדרים ידנית על ידי בעל החדר לפני שמישהו רשאי להיכנס.

בואו נסתכל כיצד ליצור חדר מיידי באמצעות MultiUserChatManager:

מנהל MultiUserChatManager = MultiUserChatManager.getInstanceFor (חיבור); MultiUserChat muc = manager.getMultiUserChat (jid); חדר Resourcepart = Resourcepart.from ("baeldung_room"); muc.create (room) .makeInstant ();

באופן דומה נוכל ליצור חדר שמור:

הגדר בעלים = JidUtil.jidSetFrom (מחרוזת חדשה [] {"[מוגן באמצעות דוא"ל]", "[דוא"ל מוגן]"}); muc.create (room) .getConfigFormManger () .setRoomOwners (בעלים). submitConfigurationForm ();

6. סגל

תכונה נוספת שמספק סמאק היא האפשרות לעקוב אחר נוכחותם של משתמשים אחרים.

עם Roster.getInstanceFor (), אנחנו יכולים להשיג א לוּחַ תוֹרָנוּיוֹת למשל:

רוסטר סגל = Roster.getInstanceFor (חיבור);

ה לוּחַ תוֹרָנוּיוֹת היא רשימת אנשי קשר המייצגת את המשתמשים כ- RosterEntry מתנגד ומאפשר לנו לארגן משתמשים בקבוצות.

אנו יכולים להדפיס את כל הערכים ב- לוּחַ תוֹרָנוּיוֹת משתמש ב getEntries () שיטה:

ערכי אוסף = roster.getEntries (); עבור (ערך RosterEntry: ערכים) {System.out.println (ערך); }

יתר על כן, היא מאפשרת לנו להקשיב לשינויים בערכים ובנתוני הנוכחות שלה באמצעות a RosterListener:

roster.addRosterListener (חדש RosterListener () {ערכי חלל ציבוריים הוסיפו (כתובות אוסף) {// מטפלים בערכים חדשים} ערכי חלל ציבוריים נמחקים (כתובות אוספים) {// מטפלים בערכים שנמחקו} רשומות ריקות ציבוריות מעודכנות (כתובות אוסף) {// מטפלים בערכים מעודכנים } נוכחות חלל ציבוריתChanged (נוכחות נוכחות) {// לטפל בשינוי נוכחות}});

זה גם מספק דרך להגן על פרטיות המשתמש על ידי וודא שרק משתמשים מאושרים מסוגלים להירשם לסגל. לשם כך מיישם סמאק מודל מבוסס הרשאות.

ישנן שלוש דרכים לטפל בבקשות מנוי לנוכחות באמצעות ה- Roster.setSubscriptionMode () שיטה:

  • Roster.SubscriptionMode.accept_all - קבל את כל בקשות המינוי
  • Roster.SubscriptionMode.reject_all - דחה את כל בקשות המינוי
  • Roster.SubscriptionMode.manual - עבד בקשות מנוי לנוכחות באופן ידני

אם אנו בוחרים לטפל בבקשות מנוי באופן ידני, נצטרך לרשום א StanzaListener (מתואר בסעיף הבא) ולטפל בחבילות עם נוכחות.טיפוס.מנוי סוּג.

7. בית

בנוסף לצ'ט, סמאק מספק מסגרת גמישה לשליחת בית ולהאזין למצב נכנס.

לשם הבהרה, בית הוא יחידת משמעות סמנטית נפרדת ב- XMPP. זהו מידע מובנה שנשלח מישות אחת לאחרת באמצעות זרם XML.

אנחנו יכולים להעביר א חֲרוּזָה דרך א חיבור משתמש ב לִשְׁלוֹחַ() שיטה:

נוכחות בבית = נוכחות חדשה (Presence.Type.subscribe); connection.sendStanza (נוכחות);

בדוגמה שלמעלה שלחנו נוכחות בית כדי להירשם לסגל.

מצד שני, כדי לעבד את הביתיות הנכנסות, הספרייה מספקת שני קונסטרוקציות:

  • StanzaCollector
  • StanzaListener

באופן מיוחד, StanzaCollector הבה נחכה באופן סינכרוני לבתים חדשים:

StanzaCollector collector = connection.createStanzaCollector (StanzaTypeFilter.MESSAGE); בית בית = אספן.נאקסטResult ();

בזמן StanzaListener הוא ממשק להודעה אסינכרונית על בתים נכנסים:

connection.addAsyncStanzaListener (StanzaListener חדש () {תהליך בטל ציבורי Stanza (Stanza stanza) זורק SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {// handle stanza}}, StanzaTypeFilter.MAGE)

7.1. מסננים

יתר על כך, הספרייה מספקת סט מובנה של פילטרים לעיבוד בתים נכנסים.

אנחנו יכולים לסנן בית לפי סוג באמצעות StanzaTypeFilter או לפי תעודת זהות עם StanzaIdFilter:

StanzaFilter messageFilter = StanzaTypeFilter.MESSAGE; StanzaFilter idFilter = StanzaIdFilter חדש ("123456");

או, הבחנה לפי כתובת מסוימת:

StanzaFilter fromFilter = FromMatchesFilter.create (JidCreate.from ("[דוא"ל מוגן]")); StanzaFilter toFilter = ToMatchesFilter.create (JidCreate.from ("[מוגן באמצעות דוא"ל)");

ונוכל להשתמש במפעיל מסנן לוגי (ופילטר, אורפילטר, ללא פילטר) ליצירת פילטרים מורכבים:

מסנן StanzaFilter = AndFilter חדש (StanzaTypeFilter.Message, FromMatchesFilter.create ("[מוגן באמצעות דוא"ל)");

8. מסקנה

במאמר זה סקרנו את השיעורים השימושיים ביותר שסמאק מספק מהמדף.

למדנו כיצד להגדיר את הספרייה על מנת לשלוח ולקבל בית XMPP.

בהמשך למדנו כיצד להתמודד עם צ'אטים קבוצתיים באמצעות ChatManager ו לוּחַ תוֹרָנוּיוֹת תכונות.

כרגיל, כל דגימות הקוד המוצגות במדריך זה זמינות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found