`

XMPP登陆互踢

阅读更多
  如果JID的resource缺省,则登陆后XMPP服务器会自动分配一个resource,如tigase-10.由于XMPP是支持多点登陆的,所以不同客户端用同一个JID登陆后,服务器会为每一个客户端分配一个不同的resource以区分他们。比如A客户端的resource是tigase-10,B客户端是tigase-11,这时A的客户端的完整jid是borissun@iteye.com/tigase-10,B客户端的jid是borissun@iteye.com/tigase-11。这样如果C客户端向borissun@iteye.com/tigase-10发消息,则A会收到,向borissun@iteye.com/tigase-11则B会收到,但是向borissun@iteye.com发消息,服务器不知道到底是给谁发了,因此一定有一个客户端会丢失消息。
  如果想将XMPP做成只有一个客户端登陆,则jid的resource就要一致,比如borissun@iteye.com/boris .XMPP 的server对于resource一致的情况有两种处理的可能:

引用
If there is already an active resource of the same name, the server MUST either (1) terminate the active resource and allow the newly-requested session, or (2) disallow the newly-requested session and maintain the active resource. Which of these the server does is up to the implementation, although it is RECOMMENDED to implement case #1. In case #1, the server SHOULD send a <conflict/> stream error to the active resource, terminate the XML stream and underlying TCP connection for the active resource, and return a IQ stanza of type "result" (indicating success) to the newly-requested session. In case #2, the server SHOULD send a <conflict/> stanza error to the newly-requested session but maintain the XML stream for that connection so that the newly-requested session has an opportunity to negotiate a non-conflicting resource identifier before sending another request for session establishment.


简单的说也就是如果resource一致,第一个办法是终结活动着的那个resource,然后让最新请求的会话留下来,也就是A先登陆,B再登陆,A会掉线。第二个办法是拒绝最新的请求会话,保持第一个,也就是A先登陆,B再登陆,B登不上去。

我的实例中的server是采用的第一种方法,不管哪一种方法,要掉线的客户端会收到server发的一个error:

<stream:error xmlns:stream="http://etherx.jabber.org/streams">
<conflict xmlns="urn:ietf:params:xml:ns:xmpp-streams"></conflict>
</stream:error>


conflict代表了登陆冲突,因此只要收到了这个消息,就可以确定有其他客户端登陆了同样的jid,因此我们只用处理这个error就好。
在OC的XMPPFramework中可以这样处理:

- (void)xmppStream:(XMPPStream *)sender didReceiveError:(id)error
{
	HWLOGI(@"didReceiveError:%@",error);
    DDXMLNode *errorNode = (DDXMLNode *)error;
    //遍历错误节点
    for(DDXMLNode *node in [errorNode children])
    {
        //若错误节点有【冲突】
        if([[node name] isEqualToString:@"conflict"])
        {
            //停止轮训检查链接状态
            [_timer invalidate];
            NSString *message = [NSString stringWithFormat:@"%@さんが別の端末でログインしたため、自動的にログアウトしました。",[[[SharedAppDelegate myInfo] myCardDetial]fullNameWithSpace]];

            //弹出登陆冲突,点击OK后logout
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            alert.tag = 9999;
            alert.delegate = SharedAppDelegate;
            [alert show];
            [alert release];
        }
    }
}
2
0
分享到:
评论
1 楼 aone 2013-05-03  
你好,我们现在碰到这么个问题,不知您有没有碰到过。
1, 在机器1上登录jid: test@domain/resource1
2, 在机器2上登录同一个jid: test@domain/resource1
大多数时候机器1会收到一个conflict,但偶尔也有机器2收到conflict的情况,为什么机器2会收到?rfc6120上也提到过这种情况,但没有给出解决办法。

相关推荐

    XMPP登陆demo

    本项目提供的"XMPP登陆demo"是一个使用XMPP框架实现的登录示例,它可以帮助开发者理解并学习如何在自己的应用程序中集成XMPP服务,以便实现实时通讯功能。 在描述中提到,该示例所采用的XMPP框架版本为3.6.4。这...

    XMPP登陆器

    在“XPMM登陆”这个文件中,很可能是XMPP登陆器的源代码或者配置文件,包含了实现上述功能的具体细节。开发者可能需要理解XML流的构造,熟悉XMPP协议的规范,以及如何处理服务器的响应,才能正确实现注册和登录功能...

    android的XMPP客户端

    在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)客户端是一项常见的任务,因为XMPP是一种广泛使用的即时通讯协议,尤其适用于构建实时通信应用,如聊天、视频通话等。本篇文章将深入探讨...

    微信聊天界面(登陆,XMPP)

    微信聊天界面的实现涉及到许多IT技术,特别是网络通信和用户界面设计方面...以上就是关于"微信聊天界面(登陆,XMPP)"的相关知识点,涵盖从网络协议到用户界面设计的多个方面,展示了构建类似应用所涉及的技术和挑战。

    使用Strophe连接xmpp,轻松构建web即时聊天工具

    在本文中,我们将深入探讨如何使用Strophe.js库来连接XMPP服务器,从而轻松构建Web即时聊天工具。Strophe.js是一个轻量级的JavaScript库,专门设计用于在浏览器环境中与XMPP服务器进行交互,实现WebSocket、BOSH或...

    xmpp协议说明ppt

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,最初源自开源项目Jabber。这个协议主要用于即时消息传递(IM)和在线状态(Presence)的探测。XMPP的设计理念是开放、可扩展,...

    XMPP学习入门笔记

    ### XMPP学习入门笔记知识点详解 #### 一、XMPP简介 XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的即时通讯协议。它最初由Jabber发展而来,并于2004年成为国际标准(RFC 3920 和 RFC 3921)...

    xmpp协议介绍,XMPP体系架构

    XMPP(可扩展消息处理现场协议)是一种基于XML的实时通信协议,最初源自开源项目Jabber。...通过服务器的组件化设计和丰富的扩展机制,XMPP可以适应各种复杂的通信需求,并与其他通讯系统实现互操作。

    XMPP.rar_xmpp _通讯协议中文

    它的设计目标是提供一种灵活、可扩展且基于标准的框架,用于构建高度分布式、可互操作的即时通讯(IM)和存在服务。 XMPP的核心概念包括以下几个部分: 1. **协议基础**:XMPP建立在TCP/IP之上,使用XML流来传输...

    XMPP 核心 (内附XMPP实例)

    XMPP(Extensible Messaging and Presence Protocol,可扩展消息与存在协议)是一种基于XML的实时通信协议,被广泛用于即时通讯和在线状态管理。这个压缩包包含了一份关于XMPP核心概念的详细PDF文档以及一个名为...

    XMPP 常用XEP协议

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛应用于即时消息、在线状态管理和多人聊天等场景。XEP(XMPP Extension Protocols)是XMPP的扩展协议,用来增加XMPP的基本功能...

    XMPP正式RFC标准3920

    这包括与电子邮件、IRC、SIMPLE、SMS等系统的互操作。 #### 3. 地址空间 XMPP中的地址空间基于XML命名空间的概念,包括节点、域和资源三个部分。节点标识用户或服务,域标识服务器,资源标识客户端的具体实例。...

    XMPP.zip_XMPP即时通信_aioxmpp_xmpp _xmpp qq_即时通讯

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准协议,用于即时通信(IM)和在线状态服务。这个“XMPP.zip”文件显然包含了关于如何使用XMPP实现即时通讯,尤其是仿照QQ功能的相关资源...

    XMPP-RFC3920中文

    **XMPP (可扩展消息和出席协议)** 是一种基于XML的实时通信协议,起初由Jabber开源社区创建,后来成为Internet Engineering Task Force (IETF) 的即时消息和出席信息技术的一部分。RFC 3920是XMPP的核心协议文档,...

    xmpp协议和xmpp扩展协议

    xmpp协议和xmpp扩展协议,chm格式

    xmpp服务器端介绍

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,主要用于即时消息和在线状态的传递。在本文中,我们将深入探讨XMPP服务器端的相关知识,包括其工作原理、协议规范、以及如何搭建...

    XMPP写的注册

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛应用于即时通讯、在线状态管理和聊天应用。在iOS平台上实现XMPP的注册功能,通常涉及到以下几个关键知识点: 1. **XMPP框架...

    Android资料_XMPP

    基于XMPP的多方通信系统研究与实现.pdf 基于XMPP的P2P即时通信系统的研究及实现.kdh 基于SIMPLE和XMPP协议的移动IM研究.pdf XMPP研究与应用.pdf XMPP协议研究及其在IM系统群组通信中的应用.pdf XMPP协议分析及客户端...

    xmpp通讯协议demo

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,主要用于即时消息传递和在线状态管理。这个“xmpp通讯协议demo”是展示如何在Android平台上利用XMPP协议进行即时通讯的一个示例...

    xmpp客户端开发库

    XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛应用于即时通讯、VoIP、在线状态管理等领域。作为一个专业的IT行业大师,我很高兴为你深入解析XMPP客户端开发库及其相关知识...

Global site tag (gtag.js) - Google Analytics