仍然看ejabberd_c2s 这个gen_fsm 模块。
上面客户端与服务器建立连接的初始几步直接略过。具体参见ejabberd分析(二)
,重点看下面的交互:
注:目前的状态为wait_for_feature_request
客户端发送如下的鉴权请求给服务器:
<auth mechanism="DIGEST-MD5" xmlns="urn:ietf:params:xml:ns:xmpp-sasl"></auth>
服务器端匹配到
同时获取客户端选择的加密方式(DIGEST-MD5)。匹配到以下路径:
以上代码会向客户端发送challenge并将状态设置为wait_for_sasl_response:
<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09Imtpbmdsb25nIixub25jZT0iQXZ4aFNmYXo3ZlpmMWpqdXh2Qmo4ZTF2SUZQRHNPWDdPUWVXVEFTdiIscW9wPSJhdXRoIixjaGFyc2V0PXV0Zi04LGFsZ29yaXRobT1tZDUtc2Vzcw==</challenge>
客户端收到后返回响应:
<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">Y2hhcnNldD11dGYtOCx1c2VybmFtZT0iMTU1NTUyMTU1NTQiLHJlYWxtPSJraW5nbG9uZyIsbm9uY2U9IkF2eGhTZmF6N2ZaZjFqanV4dkJqOGUxdklGUERzT1g3T1FlV1RBU3YiLG5jPTAwMDAwMDAxLGNub25jZT0icUlaU05ORjNGVmFRN0UzRklKUXI2UFpYaHZTa0hvOFkrZ2ZBVjJ0VCIsZGlnZXN0LXVyaT0ieG1wcC9raW5nbG9uZyIsbWF4YnVmPTY1NTM2LHJlc3BvbnNlPWYxNGM0NDc4NWYwMzNlMDZkNTE1Y2I3MjI4MzVlZmI2LHFvcD1hdXRoLGF1dGh6aWQ9IjE1NTU1MjE1NTU0Ig==</response>
xmpp的验证机制可参照网上的资料。
这里啰嗦两句:
前面的<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>就是在进行TLS握手。先通过TLS传输密钥给客户端,再使用此密钥按照SASL协议进行用户名、密码等验证。
服务器端在wait_for_sasl_response函数中验证通过后发送鉴权通过的消息给客户端,并将状态设置为wait_for_stream:
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cnNwYXV0aD0wMjFkMjI4MTRmNjcwNDMxMTUxZDMwMTIwYzg3ODg0Ng==</success>
客户端继续发送如下消息给服务器,再次初始化一个流。
<stream:stream to="kinglong" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
此时服务器端的状态已经为验证通过,但客户端未绑定资源:
服务器发送bind给客户端,并将状态设置为wait_for_bind:
<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="kinglong" id="7acd9ea9" 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>
客户端接收到后发送bind响应,绑定自己的资源:
<iq id="T2U7N-0" type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>Spark 2.6.3</resource></bind></iq>
服务器端在wait_for_bind 函数中进行资源冲突的检查,完成绑定后返回成功的消息,并将状态设置为wait_for_session,等待客户端建立session:
<iq type="result" id="T2U7N-0" to="kinglong/7acd9ea9"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>12345678910@kinglong/Spark 2.6.3</jid></bind></iq>
客户端发送session请求给服务器端:
<iq id="T2U7N-1" type="set"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
服务器端的wait_for_session函数中:
对消息进行判断,成功后然后返回result消息:
<iq type="result" id="T2U7N-1" to="15555215554@kinglong/Spark 2.6.3"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
接下来调用
来创建session,并将状态设置为session_established,并在session_established2中处理接下来的客户端消息。
分享到:
相关推荐
作为一款开源软件,ejabberd遵循GPLv2许可证,允许用户自由地使用、修改和分发源代码,从而鼓励社区参与和定制化。 ejabberd是由Erlang/OTP编程语言开发的。Erlang是一种高度并发、分布式、面向过程的语言,非常...
此外,ejabberd支持自定义插件,可以满足特定需求,例如日志记录、用户行为分析等。开发者可以根据需求编写插件并与服务器集成。 总的来说,通过使用ejabberd服务器和XMPP协议,开发者可以在iOS应用中构建功能丰富...
要深入学习和理解这个demo,你需要阅读和分析这些文件中的代码,理解它们如何与ejabberd服务器交互以及如何展示群聊功能。 总结来说,ejabberd和strophe.js结合使用,可以在Web应用中实现强大的即时通信功能,包括...
在ejabberd中,`mod_privacy_odbc.erl`是用于处理用户隐私列表模块的一部分,该模块与数据库(通常通过ODBC接口)交互来存储和管理用户的隐私设置。然而,题目指出`mod_privacy_odbc.erl`的实现并没有完全遵循XMPP...
ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统,如即时消息、协作应用等。负载测试是评估ejabberd...通过分析这些内容,我们可以深入了解ejabberd的负载测试实践,从而更好地优化和管理ejabberd服务器。
开发者和IT爱好者可以通过分析源码,进一步了解其工作原理,甚至对其进行定制和扩展。 总的来说,JWChat 1.0 Beta 3是一款集成了Ajax技术和Jabber协议的即时通讯工具,具备了现代聊天应用的基本功能,并且能够灵活...
2 开发过程2.1 需求分析阶段我们首先明确了聊天工具应具备的基本功能,如一对一私聊、群聊、文件传输、表情支持等,并分析了目标用户的需求,确定了界面设计和交互方式。 2.2 概要设计阶段在这个阶段,我们绘制了...
- 用户注册和登录:客户端需要能够创建新用户并登录到XMPP服务器。 - 实时聊天:发送和接收文本、图片和其他类型的消息。 - 在线状态管理:显示用户在线、离线、忙碌等状态。 - 联系人管理:添加、删除和查看...
首先,我们要明确即时通讯系统的核心功能:用户注册与登录、好友管理、聊天记录存储与同步、实时消息传输以及离线消息处理。在这个项目中,我们将基于XMPP(Extensible Messaging and Presence Protocol)协议构建...
6. **多设备同步**:如果用户在多个设备上登录,保持聊天记录和在线状态的一致性。 7. **离线消息**:处理用户离线期间的消息存储和恢复。 8. **扩展功能**:XMPP支持许多扩展,如文件传输、语音/视频通话、地理位置...
- 服务器选择:可能使用Openfire、ejabberd等开源XMPP服务器,负责处理客户端连接、认证、会话管理和消息路由。 - 配置与部署:服务器需要正确配置域名、端口、用户认证策略等,并确保安全性和稳定性。 - 扩展...
- **登录认证**:用户通过客户端登录时,需要向XMPP服务器发送身份验证请求,并接收认证结果。 - **消息收发**:客户端应具备发送文本消息、接收消息并显示的功能。 - **联系人管理**:用户可以通过客户端添加...
“XMPP研究”压缩包内的资料可能会涵盖以上提到的各个方面,包括XMPP协议规范的详细解释、开发实践、案例分析以及可能的代码示例。通过学习这些内容,你可以深入了解XMPP的工作原理,并具备开发基于XMPP的应用程序的...
在这个案例中,文件名为"MyQQ客户端lv3"可能是指一个初级版本的XMPP客户端模拟器,可能具备基本的登录、发送和接收消息的功能。 2. **服务器**:处理客户端之间的通信,转发消息,维护用户状态。"MyQQ服务器lv2...
2. **XMPP服务器软件**:可能是诸如Openfire、ejabberd或Smack等开源XMPP服务器的定制版本。 3. **路由和处理逻辑**:处理客户端请求的服务器端脚本,可能用Java、Python、Node.js等编写,实现用户认证、消息路由、...
XMPP服务器如Openfire或ejabberd负责处理客户端之间的通信,确保消息的正确路由。 2. **AndroidPN架构**:AndroidPN由客户端和服务端两部分组成。客户端主要负责注册、登录、接收推送消息等功能;服务端则负责处理...
- 服务器端:运行XMPP服务器,如Openfire或ejabberd,处理客户端连接、消息路由等。 - 通信库:如Smack或XMPPTCPConnection,为Android客户端提供与XMPP服务器的连接和数据交换功能。 3. **源码分析** - **登录...
开发者可以使用Smack来创建连接、登录、发送和接收消息,以及处理用户状态。 5. **XMPP Connection Management**:建立和维护到XMPP服务器的连接是关键步骤,通常涉及TCP连接的建立、认证过程(如PLAIN、DIGEST-MD5...
6. **Android DEMO分析**:提供的DEMO可能包含一个简单的登录和发送/接收消息的功能,但可能不涵盖所有实际应用所需的复杂性,如错误处理、离线消息存储、多设备同步等。开发者需要根据DEMO中的代码进行扩展和优化,...