XMPP(四)消息 Message

即时消息

会话

XMPP的聊天会话没有进行正式谈判,而是自然地进行。发起对话的实体给应答者的bare JID发送一个消息,并且消息被发起者的服务器使用发起者的full JID贴上邮戳。当应答者发送一个回复时,接收人的服务器也会将应答者的full JID贴到回复的消息上。在这时,发起者知道了应答者的full JID,并且应答者知道了发起者的full JID,然后将相互的XMPP资源标识进行“锁定”。当发送接下来的消息时,两者都相互发送节到full JID,除非收到另外一个人的出席变化为止(这可能触发重新发送一个消息到bare JID)。

会话聊天状态

在会话过程中,有时我们需要知道对方正在处于什么状态,比如,我们发送了一个消息给对方,对方迟迟没有回 。我们不确定他是没有看到,还是正在输入一个很长的回复 。
状态(chat states)的通告,定义在聊天状态通告[XEP-0085]。
聊天状态描述了你所参与的对话,可以是以下状态之一:

  • starting
    某人开始一个对话,但是你还没有参与进来。
  • active
    你正参与在对话中。当前你没有组织你的消息,而是在关注。
  • composing
    你正在组织一个消息。
  • paused
    你开始组织一个消息,但由于某个原因而停止组织消息。
  • inactive
    你一段时间里没有参与这个对话。
  • gone
    你参与的这个对话已经结束(例如,你关闭了聊天窗口)。

在对话期间,聊天状态最可能进行如下变化:在composing状态组织完一个消息后,状态变为active,等待消息的回复。但是,从一个具体状态变化到另一个并不是总是有意义。例如,如果你不暂停一小段时间,在你撰写消息期间,你不能长时间地地变成inactive

例如 :你给对方发送消息的时候加入 active 的状态元素 。然后等待对方回应。

<message from="suke@skh.whu.edu.cn" 
     to="daughter@skh.whu.edu.cn"
     type="chat">
<body>Hi honey!</body>
<active xmlns="http://jabber.org/protocol/  chatstates"/>
</message>      

对方在开始进行回复之前,她的客户端发送给你一个聊天状态更新,通过添加一个< composing/>元素到一个空的消息里,说明他正在输入:

<message from="daughter@skh.whu.edu.cn" 
     to="suke@skh.whu.edu.cn"
     type="chat">
<composing xmlns="http://jabber.org/protocol/   chatstates"/>
</message>

vCard

vCard-temp[XEP-0054],能让你发布一个电子商务的卡片,叫做vCard,而且能得到其他人已经发布的vCards。
获取vCard

<iq from="beta@skh.whu.edu.cn"
id="pw91nf84"
to="suke@skh.whu.edu.cn"
type="get">
<vCard xmlns="vcard-temp"/>
</iq>

服务器的回应

<iq from="suke@skh.whu.edu.cn"
id="pw91nf84"
to="beta@skh.whu.edu.cn"
type="result">
    <vCard xmlns="vcard-temp">
        <N>
        <GIVEN>suke</GIVEN>
        </N>
        <URL>http://sku.whu.edu.cn/~suke/</URL>
        <PHOTO>
        <EXTVAL>http://www.cs.whu.edu/~rgs/ suke03a.gif</EXTVAL>
        </PHOTO>
    </vCard>
</iq>

阻止和过滤

1、简单阻止:
  • 把 jid="gmz@skh.whu.edu.cn" 加入黑名单

      <iq from="suke@skh.whu.edu.cn/Psi" 
      id="yu4er81v"
      to="suke@skh.whu.edu.cn"
      type="set">
      <block xmlns="urn:XMPP:blocking">
      <item jid="gmz@skh.whu.edu.cn"/>
      </block>
      </iq>
    

这个操作背后的操作包括:

  • 首先,你需要对对方表示成离线。当你对那个JabberID添加了阻止规则,你的服务器发送出一个不可用的出席包,以便你的老板以为你是离线。从那时起,任何时候你更新你的出席(例如,恢复在线),相关的出席节不会被发送到gmz@skh.whu.edu.cn(似乎你永远不再登陆)。
  • 其次,你的服务器需要确认对方不能用任何方式找出你在线。这意味着你的服务器对进来的IQ-get或IQ-set使用< service-unavailable/>错误应答,忽略进来的任何< message/>消息(或再次返回一个< service-unavailable/>错误),并且放弃任何进来的< presence/>节。
  • 最后,您的服务器需要防止你做一些愚蠢的事情,比如向你之前的上司发送一个消息或IQ请求,这样它会对任何发送给gmz@skh.whu.edu.cn 向外的节回复一个< not-acceptable/>错误。
2、高级阻止和过滤:

有时候你想通过过滤和阻止拥有更多的控制,例如,当你正在登录到你的IM服务器时,你不想要接收到你200个同事的状态更新,因为这样会占据你非常有限的带宽。在另一方面,你又确实想要接收他们发送给你的消息。而且,你也不想阻止所有进来的出席包,因为你想知道你家里人哪一个在线,你需要一个finer-grained协议来控制你的交通过滤规则。
XMPP再次发挥出它的作用。然后简单通讯阻止使用一个基本的阻止列表,full-featured隐私协议使用一种更高级的隐私列表。一个隐私列表是一个针对所有交通匹配的规则列表,包括进来的和出去的。如果一个规则匹配一个出去的包,与规则相关的行为将作用于包。例如,考虑如下的隐私列表:

<list name="mylist">
<item type="jid" value="gmz@skh.whu.edu.cn" 
action="deny" order="1">
<iq/>
<message/>
<presence-out/>
</item>
<item type="group" value="C207" action="deny" order="2">
<presence-in/>
</item>
<item action="allow" order="3"/>
</list>
  • 来自gmz@skh.whu.edu.cn的消息和第一条规则匹配。因此,如果你的服务器接收到一个来自你的之前的上司的IQ或消息节,它会忽略这个节或返回一个错误。
  • 但是,如果你的服务器接收到一个来自你之前的上司的出席节,并且这个节与第一个隐私规则不匹配,那么你的服务器继续让它与第二条规则匹配。由于你不再和你之前的上司一起工作了,所以他不在你名册里的“工作”组。因此,你的服务器继续下一条规则(这个例子中的最后一个规则)。你瞧,进来的出席节匹配最后一个规则,因此你的服务器允许这个节通过。现在你可以看到你之前的上司是否在线,但是他不能和你进行通讯!

特定隐私规则的结合为允许和阻止通讯提供了一个强大的工具,因为你的隐私列表可以包含无限数量的按照任何顺序的隐私规则(通过< item/>元素标识)。每个给定的规则的行为要么是allow,要么是deny,并且处理节的规则类型是基于一个特定的JabberID、名册分组名或者出席订阅状态。最后,节之间要进行匹配,基于他们是否是消息,是否是进来的出席通告(例如,不包括订阅相关的出席节),是否是出去的出席通告、是否是IQ或所有的节(包括订阅相关的节)。在实践中,这些更高级的阻止和允许的方法提供基本的过滤以代替那些简单的阻止(尽管付出更大的复杂度代价)。

更多聊天扩展

  • 可扩展节地址[XEP-0033]让你在没有使用聊天室的情况下,同时发送单个消息给多个接收者。
  • 高级消息处理[XEP-0079]提供一种控制消息传递的方式;例子包括消息终止和阻止消息因为延迟传递而被脱机存储。
  • 消息回执[XEP-0184] 基于标题做你所期望做的:它提供一个端到端的机制来决定是否目的接收人真正的接收到了这个消息。
  • 消息归档[XEP-0136]定义了一种在服务器上存储消息的技术,而不是将他们存储到你的本地机子上。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容