`
zhonglunshun
  • 浏览: 138684 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

asmack登录冲突(多端登录冲突)处理

 
阅读更多

功能:登录冲突;

 

效果:弹出对话框,您的账号在xxx设备登录,您已下载;

 

实现步骤:

asmack给我们提拱了一整套连接错误方案,其中就包括了登录冲突;

开始的时候,我还自己去写了一个,原理是上线的时候发送一个自定义的packet出去告诉登陆上的那个用户下线,后来发现这个方法行不通,因为另一端已经下线了,根本拿不到这条消息。

 

后来我想会不会在ConnectionListener里面就有呢?之前我实现登录的时候密码错误用的是捕获登录失败的时候抛出来的异常,所以这次变聪明了,首先从带异常的方法入手;找到以下两个方法:

 

public void connectionClosedOnError(Exception e)

public void reconnectionFailed(Exception e)

 

然后我知道异常都封装在exception,要获取到消息,只要从这些异常对象里面取就行了。因为是xmpp相关的异常,所以肯定是属于XMPPException;于是我把光标停留在这个类,出现如下提示:

 

 

 org.jivesoftware.smack.XMPPException


A generic exception that is thrown when an error occurs performing an XMPP operation. XMPP servers can respond to error conditions with an error code and textual description of the problem, which are encapsulated in the XMPPError class. When appropriate, an XMPPError instance is attached instances of this exception.

When a stream error occured, the server will send a stream error to the client before closing the connection. Stream errors are unrecoverable errors. When a stream error is sent to the client an XMPPException will be thrown containing the StreamError sent by the server.

Author:
Matt Tucker
See Also:
XMPPError

 

 

最后面有个,同看XMPPError,于是我又把光标停在XMPPError,出现了如下信息:

 

 org.jivesoftware.smack.packet.XMPPError


Represents a XMPP error sub-packet. Typically, a server responds to a request that has problems by sending the packet back and including an error packet. Each error has a code, type, error condition as well as as an optional text explanation. Typical errors are:


--------------------------------------------------------------------------------
 Code XMPP Error Type 
500 interna-server-error WAIT 
403 forbidden AUTH 
400bad-request MODIFY > 
404 item-not-found CANCEL 
409 conflict CANCEL 
501 feature-not-implemented CANCEL 
302 gone MODIFY 
400 jid-malformed MODIFY 
406 no-acceptable MODIFY 
405 not-allowed CANCEL 
401 not-authorized AUTH 
402 payment-required AUTH 
404 recipient-unavailable WAIT 
302 redirect MODIFY 
407 registration-required AUTH 
404 remote-server-not-found CANCEL 
504 remote-server-timeout WAIT 
502 remote-server-error CANCEL 
500 resource-constraint WAIT 
503 service-unavailable CANCEL 
407 subscription-required AUTH 
500 undefined-condition WAIT 
400 unexpected-condition WAIT 
408 request-timeout CANCEL 


Author:
Matt Tucker

 发现了有登录冲突的错误代码,然后我加进去这么一段:

 

 

 

@Override
	public void reconnectionFailed(Exception e) {
		if (!PubUtil.volidateNet(mContext))
			return;

		if (e instanceof XMPPException) {
			XMPPException xe = (XMPPException) e;
			final XMPPError error = xe.getXMPPError();
			int errorCode = 0;
			if (error != null) {
				errorCode = error.getCode();// larosn 0930
				Log.v("IMXmppManager", "连接断开,错误码" + errorCode);
				if (errorCode == 409) {// 被踢下线
					mContext.sendBroadcast(new Intent(
							IMPubConstant.ACTION_LOGIN_CONFLICT));
				} else if (errorCode == 502) {// 与远程服务器断开

				}
			}
		}else
			reconnectionBrodcat(true);
	}

 然而并没啥用,这时候我就把希望放在了剩下的connectionClosedOnError方法中,同时配合xmpp协议看到了登录冲突的时候服务器是返回这个StreamError节点的xml流,我跟踪进去找到了StreamError是org.jivesoftware.smack.packet.StreamError包下的,开始我以为StreamError也是packet,计划用监听packet的方式捕获到这个异常;点击进去源码我傻眼了,这个StreamError不是packet的子类;然后我把目标转向了XMPPException,果然在XMPPException下有这个方法:xe.getStreamError();,这就获取到StreamError了,然后在他下面有errorCode,不过这个是字符串方式,我对比了协议,写了这么一段,然后,it works!

if (e instanceof XMPPException) {
			XMPPException xe = (XMPPException) e;
			final StreamError error = xe.getStreamError();
			String errorCode = "";
			if (error != null) {
				errorCode = error.getCode();// larosn 0930
				Log.v("IMXmppManager", "连接断开,错误码" + errorCode);
				if (errorCode.equalsIgnoreCase("conflict")) {// 被踢下线
					mContext.sendBroadcast(new Intent(
							IMPubConstant.ACTION_LOGIN_CONFLICT));
					return;
				}
			}

 

 

好了,登录冲突的实现就这样完成了。有啥疑问可以在下面提问。尊重作者的劳动成果,装载请注明出处,谢谢;

 

0
1
分享到:
评论

相关推荐

    Adroid asmack 登录 通信 群组会话

    Android ASMack是一个基于Java的XMPP(Extensible Messaging and Presence Protocol)库,它允许开发者在Android平台上实现即时通讯功能,如登录、发送消息、管理群组等。OpenFire是一款流行的开源XMPP服务器,用于...

    Asmack登录

    Asmack是一个开源的Java...以上是对Asmack登录及其实现中涉及的关键技术点的详细解释,涵盖了从连接建立、身份验证到聊天功能、头像处理等多个方面。了解并熟练掌握这些知识点对于开发基于XMPP的Android应用至关重要。

    asmack实现android端文件上传下载

    在android端,实现asmack的文本、文件传输。使用google的jar包。配置XmppTool.java的连接地址和端口号。最重要的是更改test@haiboidea-pc/Spark 2.6.3,test:聊天对象;haiboidea-pc:服务器名称;Spark 2.6.3:...

    android asmack 注册 登陆 聊天 多人聊天室 文件传输

    2. **多线程处理**:为了保证用户体验,聊天消息的发送和接收通常在后台线程进行,避免阻塞UI主线程。 **多人聊天室** 1. **创建聊天室**:MultiUserChat类用于创建和管理多人聊天室。开发者需要指定聊天室的名称、...

    asmack android

    asmack asmack asmack asmack asmack

    asmack连接openfire测试

    其次,asmack库详解:asmack是Smack库的Android版本,它允许Android应用通过XMPP协议连接到服务器,进行用户注册、登录、发送接收消息、管理联系人列表等一系列操作。由于Android平台的安全限制,asmack对Smack进行...

    asmack-4.0.7源码

    - **文件传输**:ASMACK支持使用Jingle进行文件传输,需要通过`FileTransferManager`发起或接收文件请求,处理文件传输的状态。 - **Roster操作**:通过`Roster`类管理好友列表,包括添加、删除好友,获取好友信息...

    asmack类库

    - **事件驱动**:asmack采用事件驱动的编程模型,允许开发者在特定事件(如接收到新消息)发生时执行相应的处理代码。 - **资源管理**:asmack提供了高效的连接管理和资源分配,确保了在网络不稳定时仍能保持良好的...

    asmack源码

    `Roster`类用于处理好友列表,`ChatManager`处理一对一聊天,而`MUCManager`则处理多用户聊天室。 **4. 消息与事件处理** ASMack通过`PacketListener`和`PacketFilter`接口提供了消息监听和过滤机制。开发者可以...

    asmack 4.0.5 帮助文档

    7. **性能和优化**:在Android环境中,考虑到电池和网络资源的限制,使用ASMack时需要注意优化连接和消息处理的效率。 8. **错误处理**:ASMack的帮助文档会详细列出可能出现的错误情况以及对应的解决建议,这对于...

    asmack消息处理流程

    asmack的消息处理流程,需要的朋友可以自己下载哦,附图片

    xmpp android asmack 即时通讯

    ASMACK是专门为Android优化的轻量级JABBER/XMPP库,它提供了与JABBER服务器交互所需的API,包括连接、登录、发送和接收消息、管理联系人列表等。 **ASMACK库的使用** 1. **初始化**: 首先,你需要创建一个`...

    asmack-master.zip

    【asmack-master.zip】是一个包含asmack库源代码的压缩包,主要用于Android平台上的即时通讯(IM)开发,尤其适用于基于XMPP(Extensible Messaging and Presence Protocol)协议的应用。XMPP是一种开放标准,广泛...

    ASmack即时聊天

    在实际的开发过程中,服务器端通常会选用Openfire,这是一个开源的XMPP服务器,支持多平台,并且具有良好的可扩展性和安全性。Openfire提供了用户管理、群组管理、安全策略设置等一系列功能,可以满足不同规模的即时...

    asmack-android

    ASMACK库提供了XMPP连接管理器、实体(如用户、群组)管理、IQ(信息查询)处理、事件监听等功能。开发者需要按照库的API文档来初始化连接、建立会话、发送和接收消息,以及处理各种XMPP事件。 为了确保在Android...

    asmack2解决文件传输问题

    7. **错误处理**:当出现网络中断、文件损坏或其他异常情况时,asmack2应该能提供相应的错误处理机制,确保文件传输的健壮性。 在实际开发中,可能会遇到asmack的一些已知问题,例如兼容性问题、内存泄漏、性能瓶颈...

    asmack的jar包

    asmack的jar包

Global site tag (gtag.js) - Google Analytics