- 浏览: 579785 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (253)
- java (84)
- python (22)
- 设计模式 (12)
- 数据结构和算法 (7)
- ibatis (1)
- 数据挖掘 (2)
- 集体智慧读书笔记 (1)
- ubuntu (4)
- lucene (11)
- 算法 第4版 (11)
- apache mina (16)
- memcached (1)
- android (9)
- netty (6)
- mongodb (2)
- maven (2)
- openfire (2)
- 服务端 (21)
- 产品 (0)
- apache (1)
- 选择 (2)
- 构架WEB高性能站点 (7)
- redis (8)
- 诗词歌赋 (3)
- 源代码阅读 (5)
- 前端 (1)
- javascript (3)
- guice (1)
- 分布式 (5)
- 总结-2014 (4)
- jvm (1)
最新评论
-
liu_jiaqiang:
写的挺好
maven多项目管理 -
H972900846:
我想知道哪里整的,如果是自己写的,那有点牛呀如果是抄的请说明出 ...
SSL身份认证原理 -
春天好:
博主写的很好,赞一个,多谢分享 *(^-^*)分享一个免费好用 ...
定向网站爬虫---初级例子 -
fenglingabc:
经过测试,parameterType="java.u ...
mybatis获取主键和存储过程返回值 -
jyghqpkl:
[u][/u] ...
Cookie的secure 属性
1.5.4 IQ 节 <iq>节表示的是Info/Query(信息与查询),它为XMPP通信提供请求与响应机制。它与HTTP 协议的基本工作原理非常相似,允许获取和设置查询,与HTTP 的GET 和POST 动作类似。 每个<iq>节都必须有一个响应,而且前面曾经提到过,该节的必需的id 属性将用来把响应 与导致该响应的请求关联起来。<iq>节有四种,通过该节的type 属性区分。有两种<iq>节请求 (get 和set)和两种响应(result 和error)。在本书中,这些节通常被缩写为IQ-get、IQ-set、IQ-result 和IQ-error。 每一个IQ-get 或IQ-set 节均必须接收响应的IQ-result 或IQ-error 节。下面的示例给出了一 些常见的<iq>节以及它们可能的响应。注意,与<message>和<presence>节(它们定义了子元素) 不同,<iq>节通常只包含与它们功能相关的扩展元素。此外,每一对<iq>节必须匹配id 属性。 <iq from='jane@longbourn.lit/garden' type='get' id='roster1'> <query xmlns='jabber:iq:roster'/> </iq> <iq to='jane@longbourn.lit/garden' type='error' id='roster1'> <query xmlns='jabber:iq:roster'/> <error type='cancel'> <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq> Jane 向她的服务器发送了一个格式错误的花名册请求。服务器使用一个错误提示节作为响 应。后面我们将详细讨论错误提示节。 <iq from='jane@longbourn.lit/garden' type='get' id='roster2'> <query xmlns='jabber:iq:roster'/> </iq> <iq to='jane@longbourn.lit/garden' type='result' id='roster2'> <query xmlns='jabber:iq:roster'> <item jid='elizabeth@longbourn.lit' name='Elizabeth'/> <item jid='bingley@netherfield.lit' name='Bingley'/> </query> </iq> 在重新发送正确的请求之后,服务器将Jane 的简短花名册响应给她。可以看到Elizabeth 和 Bingley 均在Jane 的联系人列表中。 第1 章了解 XMPP 协议 15 <iq from='jane@longbourn.lit/garden' type='set' id='roster3'> <query xmlns='jabber:iq:roster'> <item jid='darcy@pemberley.lit' name='Mr. Darcy'/> </query> </iq> <iq to='jane@longbourn.lit/garden' type='result' id='roster3'/> Jane 试图将Darcy 添加到自己的花名册中,服务器用一个空白IQ-result 节来指出添加成功。 如果应答节只是成功确认,那么IQ-result 节通常是空白的。 在任何需要结果数据或者需要简单确认的场合中,<iq>节都非常有用。大多数XMPP 扩展 协议混合使用<iq>和<message>节来实现它们的功能。<iq>节用于类似于配置和状态变化这样的 信息,而<message>节则用于常规通信。在某些场合中,<iq>节也用于通信,这是因为节确认机 制可实现限速功能。
NotificationManager类中的IQ创建方法
/** * Creates a new notification IQ and returns it. */ private IQ createNotificationIQ(String apiKey, String title, String message, String uri) { Random random = new Random(); String id = Integer.toHexString(random.nextInt()); // String id = String.valueOf(System.currentTimeMillis()); Element notification = DocumentHelper.createElement(QName.get( "notification", NOTIFICATION_NAMESPACE)); notification.addElement("id").setText(id); notification.addElement("apiKey").setText(apiKey); notification.addElement("title").setText(title); notification.addElement("message").setText(message); notification.addElement("uri").setText(uri); IQ iq = new IQ(); iq.setType(IQ.Type.set); iq.setChildElement(notification); return iq; }
tinder-1.2.1.jar包中的 IQ类中的方法
public void setChildElement(Element childElement) { for (Iterator i = this.element.elementIterator(); i.hasNext(); ) { this.element.remove((Element)i.next()); } this.element.add(childElement); }
public IQ() { this.element = docFactory.createDocument().addElement("iq"); String id = String.valueOf(random.nextInt(1000) + "-" + sequence++); setType(Type.get); setID(id); }
/** * Broadcasts a newly created notification message to all connected users. * * @param apiKey the API key * @param title the title * @param message the message details * @param uri the uri */ public void sendBroadcast(String apiKey, String title, String message, String uri) { log.debug("sendBroadcast()..."); IQ notificationIQ = createNotificationIQ(apiKey, title, message, uri); for (ClientSession session : sessionManager.getSessions()) { if (session.getPresence().isAvailable()) { notificationIQ.setTo(session.getAddress()); session.deliver(notificationIQ); } } }
IQ是继承Packet其中
@NotThreadSafe public abstract class Packet { private static final Logger Log = LoggerFactory.getLogger(Packet.class); protected static final DocumentFactory docFactory = DocumentFactory.getInstance(); protected Element element; protected JID toJID; protected JID fromJID;
public void setTo(JID to) { this.toJID = to; if (to == null) { this.element.addAttribute("to", null); } else this.element.addAttribute("to", to.toString()); }
可以看出JID就是要广播的地址 ,xmpp协议中的地址。
Connection类中的 使用Apache mina管理
public void deliver(Packet packet) { log.debug("SENT: " + packet.toXML()); if (!isClosed()) { IoBuffer buffer = IoBuffer.allocate(4096); buffer.setAutoExpand(true); boolean errorDelivering = false; try { XMLWriter xmlSerializer = new XMLWriter(new IoBufferWriter( buffer, (CharsetEncoder) encoder.get()), new OutputFormat()); xmlSerializer.write(packet.getElement()); xmlSerializer.flush(); buffer.flip(); ioSession.write(buffer); } catch (Exception e) { log.debug("Connection: Error delivering packet" + "\n" + this.toString(), e); errorDelivering = true; } if (errorDelivering) { close(); } else { session.incrementServerPacketCount(); } } }
发表评论
-
protobuf-dt插件
2015-03-24 13:16 1419protobuf-dt: 安装前先安装xtext 可 ... -
java循环标签
2015-03-20 16:13 609今天看 源码的时候 看到 一个小语法 参考: ... -
java程序性能优化 --阅读
2014-10-14 17:56 708闲着,真实无聊; 发现一本好书《java程序性能优 ... -
jetty invalid entry CRC问题
2014-08-04 11:42 16101: http://stackoverflow.com/qu ... -
guice注入
2014-05-24 12:13 9447Google Guice3.0: http://code. ... -
eclipse快捷键
2014-05-21 16:01 5781: clrl+alt+r : 最常用,快速定位到文件 2 ... -
java clone
2014-05-16 17:04 526转:http://www.blogjava.net/ora ... -
ThreadLocal
2014-05-13 18:39 772简单介绍一下ThreadLocal的原理:1.Thread ... -
hession
2014-04-30 12:33 696一、首先先说Hessian是什么? Hessian:he ... -
冒泡和快速排序java
2014-04-19 18:01 7581: 冒泡最简单一种: /** * 算法效率o ... -
java生产者和消费者模型三种实现
2014-04-19 17:51 13661: 生产者和消费者的问题,生产者生产产品到缓冲区,消费者 ... -
单例模式
2014-03-14 16:06 749今天看到群里,关于单例模式的多线程下的安全问题: 1:最 ... -
freemarker的使用
2014-02-28 16:42 8421:freemarker eclipse插件安装方法:ht ... -
java 引用类型和内存泄露
2013-11-21 17:48 585http://blog.csdn.net/luoshenfu ... -
java泛型
2013-11-07 13:52 434Class<T>在实例化的时候,T要替换成具体 ... -
filter执行顺序
2013-10-12 11:16 1124多个筛选器的运行顺序取决于下列规则: 将 filt ... -
spring rmi远程调用
2013-09-09 11:48 11751:以前用jmi发布服务,实现分布式的一种方式,远程调用, ... -
spring mvc返回204状态码
2013-07-24 09:27 39261:204是没内容 不跳转的 代表请求成功的意思 ... -
editplus去掉多余空行
2013-07-19 21:05 7391: ^[ \t]*\n 用正则表达式替换 -
spring3 aop 使用详细
2013-06-06 11:10 01:目标:拦截所有的@Controller中的方法 ...
相关推荐
在即时通讯工具的实现原理中,XMPP协议扮演着关键角色。客户端和服务器之间通过TCP/IP建立连接,使用XMPP协议进行数据交换。服务器作为中心节点,负责接收和转发消息,同时处理用户登录、状态更新和会话管理等功能。...
该协议的核心功能定义在 RFC 3920 中,包括 XML 流、TLS 和 SASL 加密、流的根元素之下的 `<message/>`、`<presence/>` 和 `<iq/>` 子元素等。 XMPP 协议的主要特点是基于 XML 的流化结构,可以用于各种类型的实时...
### XMPP协议分析 #### 一、XMPP协议概述 XMPP(Extensible Messaging and Presence Protocol,可扩展消息出席协议)是一种基于XML的即时通讯协议,最初由Jabber开源社区于1999年开发。2002年,IETF(Internet ...
IQ消息类型在XMPP协议中非常关键,主要用于客户端和服务端之间的请求和响应交互。例如,在进行用户认证时,会涉及到IQ消息的处理。 ```csharp private void ProcessIQ(IQ iq) { if (iq.Query.GetType() == typeof...
通过深入解析XMPP-RFC3921(中文)文档,我们不仅了解了XMPP协议的基本概念和核心功能,还学习了如何在实际应用中正确使用XMPP协议。无论是在个人通讯还是企业级应用中,掌握这些知识点都是非常重要的。希望本文能够...
XMPP(可扩展消息处理现场协议)是一种基于XML的实时通信协议,最初源自开源项目Jabber。它的设计目的是用于即时消息(IM)服务和在线状态检测。XMPP的核心概念是构建在TCP/IP协议之上的XML流,使得数据在客户端和...
让我们深入探讨一下SMACK库和XMPP协议的相关知识点。 **SMACK库** 1. **SMACK简介**:SMACK是Simple XMPP Client Library for Java的缩写,是一个开源的Java库,用于构建XMPP客户端应用。它提供了与XMPP服务器交互...
**XMPP协议概述** XMPP的设计目标是通过XML流实现实时信息交换,用于即时消息、出席状态更新以及请求-响应服务。它的主要特点在于其可扩展性,允许开发者构建各种应用程序以满足不同需求。 ### 2. **通用架构** ...
总的来说,XMPP协议提供了一套灵活、安全且标准化的即时通讯解决方案,其强大的可扩展性使得开发者可以根据具体需求构建复杂的企业级或个人通信应用。通过理解XMPP的基本概念、架构、工作原理和安全机制,我们可以更...
XMPP协议的灵活性使得它能适应多种应用场景,如企业级即时通讯、物联网通信、游戏中的实时交互等。开发者可以通过开源库,如Smack、Java Jabber Library(JJlib)等来实现XMPP功能。 为了更好地理解和应用XMPP,...
文件传输是XMPP协议的一个重要应用场景,通常通过XEP(XMPP Extension Protocols)进行扩展来支持。例如,XEP-0096定义了文件传输的规范,包括如何发起和接受文件传输请求,以及如何处理文件的长度、起始位置等信息...
这个压缩包文件包含了使用VC6(Visual C++ 6.0)编译的一个XMPP客户端应用的源代码,可以帮助开发者了解XMPP协议的工作原理以及如何在C++环境下实现它。 首先,我们来看看`Jabba`系列的文件。`Jabba.aps`是Visual ...
《深入解析XMPP-RFC3921:即时消息与出席信息的标准协议》 XMPP-RFC3921,全称《可扩展的消息和出席信息协议:即时消息和出席信息》,是由网络工作组的Saint-Andre编写的,于2004年10月由Jabber软件基金会发布。该...
为了最小化实现XMPP协议,我们需要关注四个关键部分:XML流、流认证、资源绑定与地址规划以及XML节。下面将详细阐述这四个方面的内容。 1. **XML流**: XML流是XMPP的基础,它定义了客户端和服务器之间进行通信的...
### XMPP协议简介 《XMPP:核心协议》(RFC3920)是一份由互联网工程任务组(IETF)发布的文档,该文档详细介绍了Extensible Messaging and Presence Protocol(可扩展消息与呈现协议,简称XMPP)的核心功能。XMPP...
本资源包含的是XMPP协议的通讯组件源代码,主要针对C#和.NET平台。"jabber-net"这个文件名暗示了它可能是一个.NET实现的XMPP客户端库,可能兼容Jabber服务器,Jabber是XMPP早期的一个实现,现在通常用来指代XMPP...
1. **选择XMPP框架**:在iOS上,有多个开源的XMPP框架可以选择,如XMPPIQ、XMPPFramework和Swift XMPP等。这些框架简化了与XMPP服务器的交互过程。 2. **配置XMPP服务器**:需要设置一个支持XMPP的服务器,如...