IM
IM(Instant Meassge),核心是提供網絡上從一個地方到另一個地方的快速路由信息的能力,因此,XMPP 服務器被優化用來在很小的延遲裏處理大量的相對小的消息。
消息投遞
XMPP服務器連接方式如下(無中間服務器跳躍)
消息傳遞流程:
1 發起用戶客戶端通過client-to-server XML流推送消息節到自身服務器
2 發起用戶服務器在節上貼上from地址的郵戳,並檢查to地址
3 發起用戶服務器通過server-to-server XML流路由消息到目的用戶服務器(無中間服務器跳躍)
4 目的服務器接收到消息節,服務器檢查目的用戶是否在線,如果在線,服務器立即通過server-to-client XML 流傳遞
消息到目的用戶的在線設備中的一個或多個
特殊投遞
chat 和 normal 消息被接收人的服務器以一種特定的方式處理:如果消息是投遞到賬戶的 bare JID(裸JID),服務器立即把消息傳遞給當前與賬戶關聯的優先級最高的資源。
聊天狀態通告
聊天狀態描述了你所參與的對話,在消息節中嵌入相關的聊天狀態元素來進行對話中的狀態改變。
示例:
<message from="[email protected]"
to="[email protected]"
type="chat">
<body>Hi Daye Nihao!</body>
<active xmlns="http://jabber.org/protocol/chatstates"/>
</message>
狀態如下:
1 starting 某人開始一個對話,但是你還沒有參與進去
2 active 你正參與在對話中,當前沒有組織消息,而是在關注
3 composing 你正在組織一個消息
4 paused 你正在組織一個消息,但由於某些原因停止組織消息
5 inactive 你一段時間沒有參與這個對話
6 gone 你參與的對話已結束(例:你關閉了聊天窗口)
狀態轉變圖
格式化消息
XMPP讓你能夠自定義消息的外觀或表達,利用Html子集或者CSS格式文本,包括許多流行的風格格式,包括顏色、字體、文字大小、字體粗細(例如,粗體)和字體風格(例如,斜體)、字體邊緣、文本對齊(例如,居中)、和文本裝飾(例如,下劃線)。
示例:
<message from="[email protected]"
to="[email protected]"
type="chat">
<body>I love this movie I saw last night, it's awesome!</body>
<html xmlns="http://jabber.org/protocol/xhtml-im">
<body xmlns="http://www.w3.org/1999/xhtml">
<p>
I <em>love</em>, this new movie I saw last night,it's <strong>awesome</strong>!
</p>
</body>
</html>
</message>
阻止和過濾通訊
阻止-一個簡單方法
需阻止某用戶通訊時,若服務器支持簡單通訊阻止,只需要向自己服務器發送一個適當的 IQ-set即可:
<iq from="[email protected]/Psi"
id="yu4er81v"
to="[email protected]"
type="set">
<block xmlns="urn:XMPP:blocking">
<item jid="[email protected]"/>
</block>
</iq>
意味着user2無法用任何方法獲取user1的在線信息,user1服務器會忽略所有來自user2的<message/>以及應答IQ-get或IQ-set爲<service-unavailable/>,而且會阻止user1向user2發送消息或者IQ請求,並返回<not-acceptable/>錯誤
在通 簡單訊阻止中 ,需要解封時,也只需要向自己服務器發送一個適當的 IQ-set即可:
<iq from="[email protected]/Psi"
id="ng23h57w"
to="[email protected]"
type="set">
<unblock xmlns="urn:XMPP:blocking">
<item jid="[email protected]"/>
</unblock>
</iq>
高級阻止與過濾
通過隱私列表實現,隱私列表是一個針對所有交通匹配的規則列表,包括進來的和出去的
<list name="mylist">
<item type="jid" value="[email protected]" action="deny" order="1">
<iq/>
<message/>
<presence-out/>
</item>
<item type="group" value="C208" action="deny" order="2">
<presence-in/>
</item>
<item action="allow" order="3"/>
</list>