openfire连接登陆优化方案
来源:互联网 发布:android官方文档 知乎 编辑:程序博客网 时间:2024/06/02 12:46
openfire连接登陆优化方案
版权声明:本文为博主原创文章,未经博主允许不得转载。
客户端登陆openfire,大概总共需要9个来回才完成登录。
在2G情况下,就表现为客户端登录特别慢,所以,为解决这个问题,对openfire进行了如下优化
openfire的连接、登陆过程分为几个步骤,完整报文如下,总共分为9个round trip:
===================================================================================================================
1 STREAM
RECV:<stream:stream to="jacklin-pc" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
SENT:<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="jacklin-pc" id="96508a6d" xml:lang="en" version="1.0">
SENT:<stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls><mechanisms xmlns="urn:ietf:p
arams:xml:ns:xmpp-sasl"><mechanism>DIGEST-MD5</mechanism><mechanism>JIVE-SHAREDSECRET</mechanism><mechanism>PLAIN</mechanism><mechanism>ANONYMOUS</mechanism><mechanism>CRAM-MD5</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/><register xmlns="http://jabber.org/features/iq-register"/></stream:features>
2 TLS
RECV:<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
SENT:<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
3 STREAM
RECV:<stream:stream to="jacklin-pc" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
SENT:<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="jacklin-pc" id="96508a6d" xml:lang="en" version="1.0"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>DIGEST-MD5</mechanism><mechanism>JIVE-SHAREDSECRET</mechanism><mechanism>PLAIN</mechanism><mechanism>ANONYMOUS</mechanism><mechanism>CRAM-MD5</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/><register xmlns="http://jabber.org/features/iq-register"/></stream:features>
4 SASL
RECV:<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09ImphY2tsaW4tcGMiLG5vbmNlPSJMamw2RGt4Y3hGSDZxb2dTRE55Nmw2VkYreVQ2YjROMFlTa1BBSlZqIixxb3A9ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNz</auth>
SENT:<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"></success>
5 STREAM
RECV:<stream:stream to="jacklin-pc" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
SENT:<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="jacklin-pc" id="96508a6d" xml:lang="en" version="1.0"><stream:features><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features>
6 BIND
RECV:<iq id="SfW08-0" type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>Spark2.6.3</resource></bind></iq>
SENT:<iq type="result" id="SfW08-0" to="jacklin-pc/96508a6d"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>test001@jacklin-pc/Spark 2.6.3</jid></bind></iq>
7 SESSION
RECV:<iq id="SfW08-1" type="set"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
SENT:<iq type="result" id="SfW08-1" to="test001@jacklin-pc/Spark 2.6.3"/>
8 PRESENCE
RECV:<presence id="SfW08-6"><status>在线</status><priority>1</priority></presence>
9 ZLIB
RECV:<compress xmlns='http://jabber.org/protocol/compress'><method>zlib</method></compress>
SENT:<compressed xmlns='http://jabber.org/protocol/compress'/>
===================================================================================================================
1 STREAM优化
其中STREAM类似查询服务器功能,服务器会把服务器的特性返回给客户端,例如SASL策略,iq-auth,zlib压缩,xmpp-bind等等,其实,如果是内部定制的系统,这些特性服务器与客户端都是共知的,所以不需要查询,完全可以省略这些步骤。但是,我发现,在客户端第一次发送stream时,是需要初始化一些内容的,所以,需要再如下地方,加入如下代码:
org.jivesoftware.openfire.nio.ConnectionHandler
此目的是让服务器在客户端建立连接阶段就初始化客户端的资源。
2 SESSION
session其实从服务器端看,只是回复了一下客户端,并没有起什么作用,所以客户端可以不发这段报文,服务器端不需要改动。服务器端处理过程如下。
org.jivesoftware.openfire.handler.IQSessionEstablishmentHandler
3 BIND,PRESENCE,ZLIB
其实PRESENCE和ZLIB可以在客户端BIND操作之后,服务器端直接进行,不需要客户端再次协商。所以,我在以下代码,进行了以下改动:
org.jivesoftware.openfire.handler.IQBindHandler
经过以上优化之后,服务器与客户端的协商只剩下3个round trip,过程如下:
2 TLS
RECV:<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
SENT:<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
4 SASL
RECV:<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09ImphY2tsaW4tcGMiLG5vbmNlPSJMamw2RGt4Y3hGSDZxb2dTRE55Nmw2VkYreVQ2YjROMFlTa1BBSlZqIixxb3A9ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNz</auth>
SENT:<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"></success>
6 BIND
RECV:<iq id="SfW08-0" type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>Spark 2.6.3</resource></bind></iq>
SENT:<iq type="result" id="SfW08-0" to="jacklin-pc/96508a6d"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>test001@jacklin-pc/Spark 2.6.3</jid></bind></iq>
客户端按照如下节奏发送报文,并进行操作就可以了,客户端修改代码,在这里不做描述,请修改者自行尝试
- openfire连接登陆优化方案
- openfire连接登陆优化方案
- openfire连接登陆优化方案
- openfire连接登陆优化方案
- Android XMPP 例子(Openfire+asmack+spark) 出现登陆连接错误
- openfire 优化
- 用emial登陆openfire
- OpenFire匿名登陆
- openfire无法登陆解决
- openfire 安全模式登陆
- openfire实现多点登陆
- openfire使用自定义表登陆
- Openfire 性能优化
- Openfire 性能优化
- Openfire 性能优化
- Openfire 性能优化
- Openfire持续优化
- Openfire 性能优化
- cocos加载3d精灵不显示,打印台无报错
- 开发创建XMPP“发布订阅”扩展(xmpp pubsub extend)
- openfire 服务端讯息回执添加和响应
- 在openfire中添加消息队列,防止聊天信息丢失方法
- 高德API调研
- openfire连接登陆优化方案
- 简明教程-linux 之 7z文件解压缩
- 使用movielens-100k测试UserBasedCF与ItemBasedCF并可视化结果
- 基于XMPP协议的消息推送的客户端和服务器端
- 从PAXOS到ZOOKEEPER分布式一致性原理与实践--2PC(Two-Phase Commit)
- Lua运行环境搭建
- 工具
- XMPP 客户端和服务端
- JDBC: 连接不同的数据库的Driver和URL的写法