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

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 36)

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.

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 . (adsbygoogle = window.adsbygoogle || []).push({});

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:

<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 (adsbygoogle = window.adsbygoogle || []).push({});

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.

ô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”/> (adsbygoogle = window.adsbygoogle || []).push({});

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”>

<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: (adsbygoogle = window.adsbygoogle || []).push({});

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

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: (adsbygoogle = window.adsbygoogle || []).push({});

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

<x xmlns=”http://jabber.org/protocol/muc#user”> <item affiliation=”none” role=”visitor”/> </x>

</presence>

Ngay lúc này user02 s không đ c quy n g i tin nh n lên phòng, n u c g ng g i m t thông báo l i s đ c g i v :

<message from=” user02@test.xmpp/school”

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

<body>Alo!</body> </message>

<message from=” myroom@conference.test.xmpp”

to=” user02@test.xmpp/school”

<body>Alo!</body> <error type=”auth”>

<forbidden xmlns=”urn:ietf:param:xml:ns:xmpp-stanzas”/>

</error> </message>

Trong tr ng h p mu n m i user02 ra kh i phòng, role c a user02 s đ c chuy n thành none, hành đ ng này ch tác đ ng trên nick phòng c a user02 nên, user02 hoàn toàn có th tham gia l i phòng, do đó thông th ng

affiliation c ng s đ c thay đ i thành outcast, c m hoàn toàn user02 tham gia vào phòng vì affiliation s tác đ ng lên JID c a user02.

Yêu c u user02 ra kh i phòng:

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

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

<query xmlns=”http://jabber.org/protocol/muc#admin”>

<item nick=”Teo” role=”none”/>

</query> </iq>

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

id=” sfb786yh”

to=” user01@test.xmpp/home”

type=”result”>

Thông báo đ n các th c th :

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

<x xmlns=”http://jabber.org/protocol/muc#user”> <item affiliation=”none” role=”none”/>

<status code=”307”/>

</presence>

Thi t l p affiliation, không cho user02 tham gia vào phòng: (adsbygoogle = window.adsbygoogle || []).push({});

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

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

<query xmlns=”http://jabber.org/protocol/muc#admin”> <item jid=”user02@test.xmpp” affiliation=”outcast”/> </query>

</iq>

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

id=” g678juiop”

to=” user01@test.xmpp/home”

type=”result”>

Thông báo đ n các th c th trong phòng:

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

type=”unavailable”

<x xmlns=”http://jabber.org/protocol/muc#user”>

<item jid=”user02@test.xmpp” affiliation=”outcast”/>

<status code=”301”/>

</x> </presence>

Trong các ví d trên, thành ph n <status/> v i các giá tr code khác nhau th hi n các lý do khác nhau, danh sách này th hi n đ y đ trong XEP-0045, sau đây là m t vài giá tr ph bi n:

Å307: yêu c u user ra kh i phòng.

2.7.3.Nick name

N u là m t th c th thông th ng tham gia m t phòng chat, th c th này c n m t nickname đ phân bi t v i các th c th khác trong phòng. XMPP th hi n vi c đ ng ký nickname này trong In-Band Registration (XEP-0077), đ u tiên là là yêu c u cung m u đ ng ký t phía d ch v MUC:

<iq from=” user01@conference.test.xmpp/home” id=”23ghy6rc”

to=”myroom@conference.test.xmpp” type=”get”

<query xmlns=”jabber:iq:register”/> </iq>

Phòng s g i l i m t IQ-result cùng v i Data Form yêu c u user01 ph i cung c p các thông tin c n thi t:

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

to=”user01@test.xmpp/home” type=”result”>

<query xmlns=” jabber:iq:register”>

<instructions> đ ng ký trên web, vào đa ch http://test.xmpp/</instructions>

<x xmlns=”jabber:x:data” type=”form”>

<title> ng ký nickname</title>

<instructions>Vui lòng đi n đ y đ thông tin</instructions> (adsbygoogle = window.adsbygoogle || []).push({});

<field type=”hidden” var=”FORM_TYPE”>

<value>http://jabber.org/protocol/muc#register</value> </field>

<field label=”H ” type=”text-single”

</field>

<field label=”Tên” type=”text-single” var=”muc#register_last><required/>

</field>

<field label=”Nickname” type=”text-single” var=”muc#register_roomnick><required/>

</field>

<field label=”Email” type=”text-single” var=”muc#register_email/>

</x> </query> </iq>

hoàn thành vi c đ ng ký user01 c n g i l i Data Form đã đi n đ y đ

thông tin:

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

to=” myroom@conference.test.xmpp”

type=”set”>

<query xmlns=” jabber:iq:register”>

<x xmlns=”jabber:x:data” type=”form”>

<field type=”hidden” var=”FORM_TYPE”>

<value>http://jabber.org/protocol/muc#register</value> </field> <field var=”muc#register_first><value>Nguy n V n</value></field> <field var=”muc#register_last><value>A</value></field> <field var=”muc#register_roomnick><value>Teo</value></field> </x> </query>

</iq>

N u vi c đ ng ký thành công m t IQ-result s đ c g i v :

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

to=” user01@test.xmpp/home”

type=”result”>

Ng c l i, nickname đã t n t i m t IQ-error s đ c g i v :

<iq from=” myroom@conference.test.xmpp” id=”23ghy6rc” to=” user01@test.xmpp/home” type=”error”> <error type=”cancel”> <conflict xmlns=”urn:ietf:params:xml:ns:xmpp-stanzas”/> </error>

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 36)