U tiên

Một phần của tài liệu Xây dựng ứng dụng Instant Message theo giao thức XMPP (Trang 33)

XMPP h tr m t tài kho n có th đ ng nh p b ng nhi u client trong cùng lúc nên c n xác đnh đ u tiên cho m i client khi đ ng nh p vì khi đó m t tin nh n đ c g i t i m t đa ch bare JID (có d ng user@domain.tld) thì s đ c g i đ n client có đ u tiên cao h n, riêng trong tr ng h p g i đ n đa ch full JID (có d ng user@domain.tld/resource) thì tin nh n s đ c g i chính xác t i client đó. u tiên này có giá tr trong kho ng -127 đ n 128.

<presence from=”user01@test.xmpp/home”> <priority>1</priority> </presence> <presence from=”user01@test.xmpp/school”> < priority >10</ priority > </presence> 2.3.5.Thông báo s hi n di n tr c ti p

Thông th ng khi thông báo s hi n di n c a m t th c th thì client s g i

đ n t t c các th c th trong roster, tuy nhiên khi c n thi t XMPP c ng h tr ph ng pháp đ thông báo đ n chính xác m t th c th b ng cách thêm thu c tính to vào stanza presence:

<presence from=”user01@test.xmpp/school”> to=”user03@test.xmpp/home”/>

Ph ng pháp này đ c s d ng khi m t th c th mu n g i tin nh n đ n m t đ n m t th c th khác mà không có trong danh sách, ho c trong quá trình tham gia và thoát kh i các phòng h i tho i.

2.3.6.Offline

đ ng xu t kh i h th ng XMPP, client ch c n g i m t stanza presence v i type=”unavailable”:

<presence type=”unavailable”/>

Khi m t client đ ng xu t kh i h th ng thì nhi m v c a server nh sau:

ÅG i thông báo đ ng xu t đ n các th c th khác trong danh sách và m t s th c th khi nh n đ c thông báo hi n di n tr c ti p tr c đó.

ÅServer s không g i các thông báo, tin nh n đ n client, n u không còn client nào khác có cùng đ a ch bare JID t n t i trên m ng (ho c có th l u tr và thông báo đ n client vào l n đ ng nh p ti p theo).

Trong tr n h p n u client mu n đ ng nh p vào h th ng thì client ch c n g i lên server stanza presence kh i t o:

<presence/>

2.3.7.Qu n lí danh sách (roster)

ti n l i cho ng i s d ng, các client s th hi n danh sách liên l c trên giao di n c a ng d ng. Tuy nhiên danh sách này đ c l u tr trên server do

đó đ l y đ c danh sách client ph i ti n hành g i yêu c u lên server b ng m t stanza IQ: <iq from=”user01@test.xmpp/home” id=”id23fjsw” to=”user01@test.xmpp” type=”get” <query xmlns=”jabber:iq:roster”/> </iq>

l c: <iq from=”user01@test.xmpp” id=”id23fjsw” to=”user01@test.xmpp” type=”result” <query xmlns=”jabber:iq:roster”> <item jid=”user02@test.xmpp” name=”Ti” subscription=”none” <group>Friend</group> </item> <item jid=”user03@test.xmpp” name=”Teo” subscription=”both” <group>Friend</group> </item> <item jid=”user04@test.xmpp” name=”Binh” subscription=”to” <group>Family</group> </item> </iq>

ng v i m t giá tr trong danh sách, ngoài thông tin đ a ch JID, còn có thông tin v tên (name), chi u đ ng ký (subscription) và nhóm (group).

2.4. Instant Messaging

ây có th coi là m t ch c n ng c b n và quan tr ng nh t mà XMPP cung c p đ h tr phát tri n các h th ng Instant Messaging, các tin nh n s đ c truy n đi m t cách nhanh chóng t m t th c th này sang th c th khác v i đ

tr ít nh t. C ng gi ng nh m t cu c h i tho i trong đ i th c, m i tin nh n trong XMPP kèm theo nh ng thông tin tr ng thái đ th hi n chính xác hành đ ng c a

m i th c th trong quá trình trò chuy n.

2.4.1.Tr ng thái trò chuy n (Chat States)

XMPP cung c p m t s tr ng thái sau:

ÅStaring: th c th A m i B tham gia trò chuy n nh ng B ch a tham gia.

ÅActive: B đ ng ý tham gia nh ng ch a so n tin nh n.

ÅComposing: B b t đ u so n tin nh n.

ÅPaused: trong khi B đang so n tin nh n thì ph i t m d ng vì m t lý do nào đó.

ÅInactive: B đã không tham gia vào cu c trò chuy n trong m t th i gian khá dài.

ÅGone: k t thúc cu c trò chuy n. (adsbygoogle = window.adsbygoogle || []).push({});

Hình 2.4: Các tr ng thái trò chuy n trong XMPP

Ngu n: Oreilly (2009), The Definitive Guide, Trang 50

th hi n tr ng thái trong m t tin nh n, thành ph n chat states s đ c thêm vào các stanza message v i thu c tính xmlns

http://jabber.org/protocol/chatstates:

to=”user02@test.xmpp/school” type=”chat” <body>Xin chào</body> <active xmlns=”http://jabber.org/protocol/chatstates”/> </message> 2.4.2.VCard

XMPP cung c p ch c n ng này nh m th hi n thông tin cá nhân c a m t th c th nh tên, đa ch , s đi n tho i, hình nh đ i di n, … c th hi n rõ trong XEP-0054.

l y thông tin vCard c a m t th c th , client s g i lên server m t IQ-get nh sau: <iq from=”user01@test.xmpp/home” id=”id24hwhs” to=”user02@test.xmpp” type=”get” <vCard xmlns=”vCard-temp”/> </iq>

Server s g i tr thông tin v user02:

<iq from=” user02@test.xmpp” id=”id24hwhs” to=” user01@test.xmpp/home” type=”result” <vCard xmlns=”vCard-temp”/> <N><GIVEN>Ti</GIVEN></N> </vCard> </iq>

Mu n c p nh t thông tin vCard, client s g i m t IQ-set lên server v i các thông tin c n c p nh t.

id=”id2423hs” to=” user01@test.xmpp” type=”set” <vCard xmlns=”vCard-temp”/> <N><GIVEN>Teo</GIVEN></N> <EMAIL><USERID> user01@test.xmpp</USERID></EMAIL> </vCard> </iq> 2.4.3. nh d ng tin nh n

ôi khi m t tin nh n thông th ng trông khá nhàm chán, và đôi lúc trong m t câu c ng c n có nh ng đi m nh n, trong tr ng h p này XMPP s cung c p kh n ng đnh d ng các b n tin khi đ c g i đi, d a vào chu n HTML và

đ c đnh ngh a l i là XHTML-IM c th trong XEP-0071. Ví d :

<message from=”user01@test.xmpp/home” to=”user02@test.xmpp/school” type=”chat”

<body>Xin chào, user02 </body>

<html xmlns=”http://jabber.org/protocol/xhtml-im”

<body xmlns=”http://www.w3.org/1999/xhtml”>

<p>Xin chào, <strong>user02</strong></p> </body>

</html>

</message>

2.5. Khám phá d ch v (Service Discovery)

Tính n ng này c a XMPP là khá quan tr ng, v i tính n ng này giúp m t th c th có th tìm hi u v các th c th khác trên m ng, có th là các tính n ng ho c giao th c mà th c th này có th h tr , giúp vi c giao ti p thu n ti n h n khá

nhi u.

c đnh ngh a trong XEP-0030, service discovery cung c p 2 ph ng th c c b n đó là disco#itemsdisco#info. disco#items giúp xác đnh m t th c th trên m ng, trong khi đó disco#info s xác đnh các tính n ng mà th c th đó h tr .

Ví d s d ng disco#items:

<iq from=” user01@test.xmpp/home” id=”idaavssw”

to=” test.xmpp”

type=”get”

<query xmlns=”http://jabber.org/protocol/disco#items”/> </iq>

ví d này user01 yêu c u đ c cung c p m t s thông tin v server mà c th đây là các thành ph n c a test.xmpp. Sau khi nh n đ c yêu c u server s g i tr l i k t qu cho user01: (adsbygoogle = window.adsbygoogle || []).push({});

<iq from=” test.xmpp” id=”idaavssw” to=” user01@test.xmpp/home” type=”result” <query xmlns=”http://jabber.org/protocol/disco#items”> <item jid=”conference.test.xmpp”/> </query> </iq>

K t qu cho th y test.xmpp có h tr conference.test.xmpp là kh n ng t ch c các cu c h i tho i nhóm. User01 c n bi t chi ti t h n các tính n ng h tr b i conference.test.xmpp, khi đó m t IQ-get v i thành ph n disco#info s đ c g i lên conference.test.xmpp:

<iq from=” user01@test.xmpp/home” id=”idafsssw”

to=” conference.test.xmpp” type=”get” <query xmlns=”http://jabber.org/protocol/disco#info”/> </iq> conference.test.xmpp s g i tr k t qu nh ng tính n ng mà mình h tr cho user01:

<iq from=” conference.test.xmpp” id=”idafsssw”

to=” user01@test.xmpp/home”

type=”result”

<query xmlns=”http://jabber.org/protocol/disco#info”>

<identity category=”conference” type=”text”

name=”chatrooms”/> <feature var=”http://jabber.org/protocol/muc”/> <feature var=”jabber:iq:register/> <feature var=”vcard-temp”/> </iq> D a trên k t qu user01 có th bi t đ c các ch c n ng mà

conference.test.xmpp cung c p: http://jabber.org/protocol/muc (XEP-0045) d ch v chat nhóm s đ c đ c p trong các ph n sau, jabber:iq:register

(XEP-0077) đ ng ký tài kho n “in-band”, vcard-temp (XEP-0054) thông tin tài kho n.

2.6. Data Forms

XMPP h tr k thu t này nh m cung c p d li u có c u trúc, đáp ng nhu c u trao đ i nh ng thông tin ph c t p gi a các th c th .

Data Froms đ c đnh ngh a trong XEP-0004.

C u trúc này đ c th hi n trong thành ph n <x/> v i không gian tên

jabber:x:data và v i thu c tính type th hi n các lo i form khác nhau, ý ngh a m i lo i đ c th hi n rõ qua hình 2.5, bao g m:

ôform.

ôsubmit.

ôcancel.

ôresult.

Hình 2.5: Quy trình t ng tác d li u Data Form

Ngu n: Oreilly (2009), The Definitive Guide, Trang 70

M i thành ph n <x/> bao g m các thành ph n con <field/> v i các thu c tính

type khác nhau mang ý ngh a khác nhau:

ôboolean: mang giá tr true ho c false, th ng s d ng đ th hi n cho m t checkbox ho c radio button.

ôfixed: th ng th hi n nhãn ho c m t h ng d n.

ôhidden: ch a giá tr đ c n đi.

ôjid-multi: danh sách các JID, phân cách v i nhau b ng thu c tính vaule.

ôjid-single: đ a ch JID đ n. (adsbygoogle = window.adsbygoogle || []).push({});

ôlist-single: danh sách ch cho phép l a ch n 1 đ i t ng.

ôtext-multi: thành ph n cho phép nh p v n b n nhi u dòng, m i dòng ch a trong thu c tính value.

ôtext-private: th ng đ c s d ng nh m t thành ph n cho phép nh u m t kh u.

ôtext-single: thành ph n nh p v n b n ch h tr 1 dòng d li u. Thu c tính var th hi n tên c a m i thành ph n <field/>.

M i thành ph n <field/> có th có nh ng thành ph n con nh :

ô<desc/>: th hi n thông tin cho <field/>.

ô<required/>: dùng đ ki m tra tính h p l c a Form.

ô<value/>: ch a các giá tr c a <field/>.

ô<option/>: th hi n m t trong nhi u l a ch n trong list-single ho c list- multi.

2.7. Chat nhóm (Multi-User Chat)

Multi-User Chat (MUC) đ c đnh ngh a trong XEP-0045, m t ch c n ng cho phép nhi u th c th cùng tham gia vào m t cu c h i tho i và g i tin nh n qua l i cho nhau. XMPP cung c p s l ng ch c n ng và ng d ng r t đa d ng trong MUC, tuy nhiên trong n i dung c a bài khóa lu n ch đ c p đ n m t s tính n ng c b n c a MUC, nh ng tính n ng th t s c n thi t và đ c s d ng r ng rãi.

2.7.1.C b n v Multi-User Chat

Nói m t cách t ng th MUC, v n đ đ c quan tâm trong vi c qu n lý và x lý là các phòng chat “room”. XMPP, MUC đ c qu n lý b i m t d ch v riêng bi t so v i h th ng Instant Messaging đ c g i là “component” và

đ c l u tr trên m t domain riêng, th ng là domain con c a domain chính. Trong n i dung khóa lu n, domain đ c s d ng là conference.test.xmpp.

myroom@conference.test.xmpp, đ tham gia vào m t phòng, client s g i m t presence tr c ti p đ n đa ch phòng, ví d user01 s tham gia vào myroom.:

<presence from=” user01@.test.xmpp/home”

to=”myroom@conference.test.xmpp/Ti”/>

Giá tr myroom@conference.test.xmpp/Ti g i là room JID c a user01. nh d ng chung c a room JID là room@domain.tld/nick.

Sau khi m t client tham gia vào m t phòng, phòng này s gi i quy t nh ng v n đ sau:

ÅG i thông báo s tham gia c a client đ n t t c các th c th đã tham gia vào phòng.

ÅClient c ng s nh n đ c thông báo s hi n di n c a t t c các th c th khác đ t o thành m t roster c c b trong phòng này.

Å ng th i m t s b n tin đ c trao đ i g n đây trên phòng c ng s đ c g i t i client.

u tiên, các th c th khác s nh n đ c thông báo tham gia c a user01:

<presence from=” myroom@conference.test.xmpp/Ti” to=”user02@.test.xmpp/shcool”/> <presence from=” myroom@conference.test.xmpp/Ti” to=”user03@.test.xmpp/library”/>

Ngay sau đó, user01 nh n đ c thông báo t các th c th khác:

<presence from=” myroom@conference.test.xmpp/Teo” to=”user01@.test.xmpp/home”/> <presence from=” myroom@conference.test.xmpp/Bin” to=”user01@.test.xmpp/home”/>

phòng, kèm theo thành ph n <delay/> ghi nh n th i gian các b n tin này đ c g i đi:

<message from=” myroom@conference.test.xmpp/Teo” to=”user01@.test.xmpp/home” type=”groupchat”> (adsbygoogle = window.adsbygoogle || []).push({});

<body>Chào</body>

<delay xmlns=”urn:xmpp:delay” stamp=”2011-09- 14T15:20:20Z”/>

</message>

<message from=” myroom@conference.test.xmpp/Bin” to=”user01@.test.xmpp/home” type=”groupchat”>

<body>Chào m i ng i</body>

<delay xmlns=”urn:xmpp:delay” stamp=”2011-09- 14T15:22:31Z”/>

</message>

T i th i đi m này, user01 đã có th i g i các tin nh n c a mình đ n các th c th khác trong phòng:

<message from=” user01@.test.xmpp/home”

to=”myroom@conference.test.xmpp” type=”groupchat”>

<body>User01 chào m i ng i</body> </message>

ng v i m i tin nh n c a client đ c g i lên, phòng s x lý và s g i tin nh n này đ n t t c các client khác trong phòng:

<message from=” myroom@conference.test.xmpp/Ti” to=”user02@test.xmpp/school”

type=”groupchat”> <body>User01 chào m i ng i</body>

</message>

<message from=” myroom@conference.test.xmpp/Ti” to=”user03@test.xmpp/library” type=”groupchat”>

<body>User01 chào m i ng i</body> </message>

Khi mu n r i kh i phòng, client s g i m t presence v i type

unavailable:

<presence from=” user01@test.xmpp/school”

to=”myroom@conference.test.xmpp/Ti” type=”unavailable”>

B n tin này c ng s đ c g i đ n t t c các client khác trong phòng đ

thông báo user01 đã r i kh i phòng:

<presence from=” myroom@conference.test.xmpp/Ti” to=”user02@test.xmpp/school”

type=”unavailable”>

<presence from=” myroom@conference.test.xmpp/Ti” to=”user03@test.xmpp/library” type=”unavailable”>

2.7.2. Phân quy n trong phòng

Là n i giao ti p c a nhi u th c th trên m ng, đôi khi không th tránh kh i nh ng th c th có nh ng hành đ ng gây nh h ng t i các th c th khác, nên v n đ qu n lý, phân quy n trong m t phòng là khá quan tr ng. (adsbygoogle = window.adsbygoogle || []).push({});

XMPP cung c p m t s lo i phòng, qua đó th hi n cách th c, quy đ nh tham gia c a các th c th , m t s lo i ph bi n:

ÅMembers-Only Room: ch nh ng th c th có trong danh sách m i có th tham gia vào phòng.

ÅOpen Room: t t c m i th c th đ u có th tham gia vào phòng.

ÅPassword-Protected Room: c n m t kh u đ tham gia vào phòng.

ÅHidden Room: phòng này không th tìm th y b i d ch v Service Discovery.

ÅPublic Room: ng c l i v i Hidden Room, có th tìm ki m qua d ch v Service Discovery.

ng th i MUC cung c p m t s roleaffiliation cho các th c th nh sau:

Åoutcast: nh ng th c th nh n affiliation này không đ c phép tham gia vào phòng.

Åvisitor: th c th này có th tham gia vào phòng, nh n thông đi p t các th c th khác nh ng không đ c phép g i các tin nh n.

Åparticipant: có kh n ng nh n và g i các thông đi p.

Åmember: th c th này có th nh n, g i và tham gia vào các phòng Member-Only.

Åmoderator: th c th này có th nh n, g i thông đi p, đ ng th i có kh n ng m i các participantvisitor ra kh i phòng, có kh n ng cho phép m t s th c th khác có quy n g i thông đi p.

Åadmin: ngoài nh ng ch c n ng nh m t moderator, admin còn có kh n ng xem thông tin v JID c a các th c th khác trong phòng, ngoài ra còn có kh n ng c u hình m t s ch c n ng c a phòng.

Åowner: có ch c n ng nh m t admin, ngoài ra còn có kh n ng qu n lý các admin, thi t l p toàn b c u hình c a phòng, và có kh n ng h y phòng.

Ví d , user01 là m t admin, user02 là m t participant, trong tr ng h p nào đó user01 mu n chuy n role c a user02 t participant xu ng còn visitor, user01 s g i m t IQ nh sau:

id=”fu82jd29”

to=”myroom@conference.test.xmpp” type=”set”>

<query xmlns=”http://jabber.org/protocol/muc#admin”> <item nick=”Teo” role=”visitor”/>

</query> </iq>

<iq from=” myroom@conference.test.xmpp” id=”fu82jd29”

to=” user01@test.xmpp/home”

type=”result”>

Phòng s thông báo đ n t t c m i th c th bao g m c user02 v s thay

đ i role này b ng m t presence:

Một phần của tài liệu Xây dựng ứng dụng Instant Message theo giao thức XMPP (Trang 33)