http://blog.chinaunix.net/uid-22027772-id-3013644.html
smack exception: No response from the server (注意:不是No response from server)
产生的原因有多种:
1. MessageListener未能正确处理response,详情参见
http://community.igniterealtime.org/thread/33598
2. 网络连接出现问题,smack客户端没办法收到response,详情参见(需爬墙……)
http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/
今天在服务器上重现了这个问题,间歇性返回No response from the server,但是网络连接状态相当好,到该服务器的http请求都顺利返回,而且速度很快,因此不是网络连接问题。同样,并不是每次返回都报错,60%的尝试是能够成功的,因此也排除原因1
重现该exception的时候,虽然不是网络导致的原因,但是跟网络环境有密切关联:
1. 在非常稳定的网络环境下(ping值稳定在5ms左右,且没有明显的抖动)出现的概率非常小
2. 在网络抖动比较大的环境下,出现非常频繁
google说明,smack的这个exception,已经report在openfire和ejabberd上都重现过,因此证明,不是单一服务器代码的问题
通过检查smack源代码,查到No response from the server的exception出现在2个文件中:
NonSASLAuthentication.java:
IQ response = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
if (response == null) {
throw new XMPPException("No response from the server.");
}
SASLAuthentication.java:
Bind response = (Bind) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
collector.cancel();
if (response == null) {
throw new XMPPException("No response from the server.");
}
IQ ack = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
collector.cancel();
if (ack == null) {
throw new XMPPException("No response from the server.");
}
问题缩小到2个方面:resource bind失败,或者确实没有收到response包
由于这边的服务器采用的是NonSASL验证的方式,所以答案只剩下:确实没有收到response
在服务器上运行tcptrack,监控进入的连接,发现smack报错的时候,tcptrack的连接记录说明,该连接被reset了,也就是说,直接从syn-ack状态跳到了reset状态,因此客户端的连接直接就断开了,所以根本不可能收到response
而smack是个高度封装的库,可配置的参数非常有限,出了用户名和密码以外,跟底层链路相关的参数就只有:SecurityMode,初步判断是该参数影响了连接,因此更改默认的enable为disable,也就是不使用TLS链路跟服务器进行通信。同样,服务器也禁用TLS之后,问题状况立即得到改善。
结论:
TLS在TCP连接的基础上,需要消耗更多的网络资源和服务器资源,来进行加密运算,因此在网络抖动非常大,或者网络比较不稳定的状况下,会严重影响通信连接,尤其是不停的断开重连,如果发现smack客户端有出现No response from the server的exception,可尝试更改连接选项,disable TLS来解决问题
分享到:
相关推荐
**XMPP客户端Java类库:Smack** **一、XMPP简介** XML即时通讯协议(Extensible Messaging and Presence Protocol,简称XMPP)是一种基于XML的开放标准,用于实现实时通讯和在线状态管理。它被广泛应用于即时消息、...
在"XMPP_Smack_Demo_Source"这个压缩包中,包含了使用Smack框架开发的示例源代码,这是一份很好的学习资料,可以帮助开发者深入理解如何利用Smack库进行XMPP协议的实现。虽然描述中提到注释可能不够完善,但通过源码...
### XMPP:终极指南 #### 一、简介与概述 《XMPP:终极指南》是一本全面介绍XMPP(可扩展消息处理协议)及其在实时应用中的应用的权威书籍。XMPP是一种基于XML的开放标准协议,用于实现即时消息(IM)、在线状态通知...
在Android平台上实现XMPP通信,Smack是一个非常重要的库,特别是在版本4.1.9时,它提供了丰富的功能,使得开发者能够轻松地构建实时通信应用,如聊天和文件传输。以下将详细介绍XMPP协议以及Smack 4.1.9在Android中...
在这个项目中,我们利用Smack-4.2.1库来实现在Android上使用XMPP进行各种交互,如登录、注册、发送单聊消息、加入聊天室和发送群聊消息等基本功能。 首先,我们需要了解Smack-4.2.1。Smack是一个开源的Java库,专门...
android下的XMPP对应smack-4.2.1,实现登录,注册,发单聊,加聊天室,发群聊等简单功能
Smack是Java和Android平台上常用的XMPP客户端库,它提供了丰富的API,使得开发者可以轻松地构建XMPP应用。 **一、环境准备** 在开始之前,确保已经在项目中添加了Smack库的依赖。你可以通过Gradle在build.gradle...
Smack是XMPP的一个Java实现库,它为开发者提供了简单易用的API,方便构建XMPP应用。 在"XMPP Smack java 聊天程序"这个项目中,你将学习到如何使用Smack库在Java环境中创建一个基本的聊天应用。首先,你需要理解...
Smack是一个开源的XMPP(eXtensible Messaging and Presence Protocol)库,广泛用于实现即时通讯(IM)和在线状态服务。在Android平台上,开发者可以使用Smack与Openfire服务器进行交互,创建实时通信应用程序。...
在本文档的"trunk"子文件中,可能包含了Smack库的源代码、示例项目或者相关的文档资源,这些都可以帮助开发者深入理解和使用Smack,从而更好地实现XMPP协议的IM功能。通过阅读源码和示例,可以学习到如何配置连接...
高仿android qq客户端,基于xmpp openfire smack。难得的即时通信学习源码。 介绍链接: http://blog.csdn.net/shimiso/article/details/11225873
基于xmpp openfire smack 的即时通信客户端,高仿qq,难得的学习资源。 资源介绍:http://blog.csdn.net/shimiso/article/details/11225873
Smack 是一个开源的XMPP(Extensible Messaging and Presence Protocol)客户端库,广泛用于构建即时通讯(IM)应用。Openfire 是一个基于XMPP协议的服务器,两者常一起使用,为开发者提供完整的IM解决方案。本篇...
Smack 3.2.2 是一个专门针对Linux平台的XMPP(Extensible Messaging and Presence Protocol)库。XMPP是一种开放标准的即时通讯协议,它允许用户进行实时、双向通信,广泛应用于聊天应用、协作工具以及物联网设备...
fabiang / xmpp 用于PHP的XMPP协议连接库(Jabber)。 系统要求 PHP最低5.6或最低7.0 psr /日志 (可选)psr / log-implementation-类似于用于记录日志的monolog / monolog 安装 是Composer的新手吗? 阅读。 将...
这个项目就是基于XMPP(Extensible Messaging and Presence Protocol)协议,使用Smack库,并结合Openfire服务器实现的。现在,我们将深入探讨这些关键组件以及如何将它们整合到Android应用中。 1. **XMPP协议**:...
smack-im-4.2.2.jar smack-tcp-4.2.2.jar smack-extensions-4.2.2.jar smack-core-4.2.2.jar smack-android-extensions-4.2.2.jar jxmpp-jid-0.6.0.jar jxmpp-core-0.6.0.jar jxmpp-util-cache-0.6.0.jar等jar包
Smack是一个开源的XMPP(eXtensible Messaging and Presence Protocol)客户端库,它为Java开发者提供了构建XMPP应用程序所需的工具。XMPP是一种基于XML的实时通信协议,广泛用于即时消息、在线状态以及多用户聊天等...
1. **SMACK简介**:SMACK是Simple XMPP Client Library for Java的缩写,是一个开源的Java库,用于构建XMPP客户端应用。它提供了与XMPP服务器交互所需的所有功能,包括连接管理、会话建立、消息发送与接收、用户状态...
Smack 是一个强大的开源 Java 库,专门用于处理 XMPP(可扩展消息处理和存在协议)通信。XMPP 是一种实时通信协议,广泛应用于即时消息、VoIP 和在线游戏等场景。Openfire 是一个流行的 XMPP 服务器,而 Smack 则是...