XMPP之tigase-packet组成

来源:互联网 发布:淘宝卖的好的飞机杯 编辑:程序博客网 时间:2024/04/30 08:34
JID :一个jid是一个用户,一个有效的JID包括一系列元素:(1)域名(domain identifier);(2)节点(node identifier,可选);(3)源(resource identifier ,可选).它的格式是node@domain/resource,node@domain

1.from(stanzaFrom) 类型jid 标识这个数据包来自哪里
2.to (stanzaTo)类型jid 标识这个数据包(消息)是发送给谁(接收者)
3.packetFrom 类型jid 标识这个包的上一个处理者是谁,(一般是 组件或者插件的唯一标识
4.packetTo 类型id 标识这个数据包将交给哪个组件或者插件处理 (一般是 组件或者插件的唯一标识
3和4在组装packet时可以不加,tigase会采用默认的方式处理,1也是可以不指定,2是必须要指定的否则你组装packet是干毛用呢

一个数据包的走向流程大概,这是我现在初学的理解,不确定正确与否,仅供参考
客户端发送packet到服务器(ClientConnectionManager.java和SessionManager.java),服务端收到后会交给数据试着交给处理者,如果找不到就将packet交给信息路由(MessageRouter.jave)来进行数据分发到具体哪个组件或者插件来处理,然后加入到对应的处理队列(一般都是使用父类里AbstractMessageReceiver.java的addPacket(Packet packet)方法)首先加入到的是in队列,tigase判断处理在加入到out队列,然后处理完成以后将数据写出去(ClientConnectionManager.java的processPacket(final Packet packet)),
还有一个很重要的方法IOService.java它是客户端连接服务器的中间人,负责读取客户端发送的数据,
每一个链接都会生成一个session,我们可以理解成tigase记录的用户状态信息,当用户退出后清掉,tigase会每隔一段时间去扫一下链接的用户session如果长时间没有收到客户端的心跳包,就将之清理掉

JID jid = JID.jidInstance("4970454@beibei.com");
JID jidto = JID.jidInstance("4468077@beibei.com");
//这里我们可以添加自己的任何属性,非常的方便的
//messageElement是我们的数据的基本节点 
Element messageElement = new Element(Message.ELEM_NAME); 
messageElement.setAttribute("type","chat");
messageElement.setAttribute(Packet.ID_ATT, messId);

//body 节点下的东西就是我们在聊天中的具体内容了
Element body = new Element("body","锄禾日当午,汗滴禾下土");
messageElement.addChild(body);

//这个节点是选择性的,他的意思是命令客户端发送回执信息,在返回的回执packet中同样也包含此节点
Element requestreceipt = new Element("request");
requestreceipt.setAttribute("xmlns", "urn:xmpp:receipts");
messageElement.addChild(requestreceipt);
Packet messagePacket = Packet.packetInstance(messageElement, jid, jidto);
//这个参数一定要有,不然 上面的所有都是徒劳,服务端根本就不会去推送消息
messagePacket.setXMLNS("jabber:client");

//最后将组装好的数据packet放到队列中去,tigase就会去处理下发这条消息了
handler.handleStanza(messagePacket);

消息体示例: 
XMPP之tigase-packet组成
仔细看在结合上面的生成代码,对应关系发现了吧
 
 
用于在两个jabber用户之间发送信息。Jsm(jabber会话管理器)负责满足所有的消息,不管目标用户的状态如何。如果用户在线jsm立即提交;否则jsm就存储。
To :标识消息的接收方。
from : 指发送方的名字或标示(id)o
Text: 此元素包含了要提交给目标用户的信息。
结构如下所示:
你好,在忙吗

 
用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.结构如下所示:
Online

元素可以取下面几种值:
Probe :用于向接受消息方法发送特殊的请求
subscribe:当接受方状态改变时,自动向发送方发送presence信息。

xmpp协议的扩展参考资料
http://wiki.jabbercn.org/XEP-0045#.E8.AE.A8.E8.AE.BA.E5.8E.86.E5.8F.B2
0 0
原创粉丝点击