`
yjl49
  • 浏览: 113785 次
社区版块
存档分类
最新评论

ejabberd分析(五)+订阅/添加好友

阅读更多

 

模块ejabberd_c2s中,状态为session_established2。

用户发送iq set 消息到服务器

<iq id="M8QF3-52" type="set"><query xmlns="jabber:iq:roster"><item jid="1555215557@kinglong" name="1555215557"><group>Friends</group></item></query></iq>

服务器端匹配到

 

 

上面这段代码需要注意ToJID的解析,发送给服务器的消息一般是默认不带to 属性的,这种情况下会自动将to 补上(这关系到包的路由 )。

ejabberd_hooks:run(user_send_packet 会记录用户发送的消息到日志。

check_privacy_route 中对权限进行效验,通过后调用ejabberd_router:route(FromRoute, To, Packet) 进行路由。

在ejabberd_router:route中调用do_route/3:

 

先用包过滤模块进行过滤,通过后在路由表中查找路由到的模块的Pid:

 

 

 

注:此处会以LDstDomain = To#jid.lserver, 去router表查找是交由本地处理,还是交由其他server 处理。

 

在模块ejabberd_local 中使用ejabberd_router:register_route(Host, {apply, ?MODULE, route}) 对当前domain进行了登记,所以会路由到此模块,并调用相应的route函数。

 

在ejabberd_local:route/3中调用do_route(From, To, Packet)。

 

客户端发送的iq消息初始to为空,但系统已自动补上ToJID(参见前面的说明),资源也为空的 iq,所以会路由到ejabberd_sm:route/3

 

 

也就是说对于那些在session_established 之后发送的消息都会交由ejabberd_sm去路由。

在ejabberd_sm中由do_route/3 来处理:

 

ejabberd_sm 中有一张 sm_iqtable 里面记录了各个命名空间的消息最终由那个模块进行处理。

 

ejabberd_sm 是一个gen_server 当调用register_iq_handler 接口时会向sm_iqtable 插入记录。

而这些命名空间处理模块的登记是由gen_iq_handler 模块的add_iq_handler/6 来进行的。

jabber:iq:roster 定义的宏为NS_ROSTER,我们在源码目录下查找此命名空间是由哪个模块调用的注册:

 


在mod_roster:start/2 中有如下代码:

 


可以看出mod_roster模块将自身的process_iq 函数在ejabberd_sm中注册为了jabber:iq:roster 命名空间的处理方法。

 

process_iq中针对发送到本地的iq调用process_local_iq/3:

 


这里会对针对iq 的 type 进行不同处理,我们目前跟踪的是<iq id="M8QF3-52" type="set">

 

 

在process_iq_set 中会遍历每一item子项调用process_item_set/3 进行处理:
remove ->mnesia:delete({roster, {LUser, LServer, LJID}});
%%否则添加
_ ->mnesia:write(Item2)end,
%% If the item exist in shared roster, take the%% subscription information from there:
Item3 = ejabberd_hooks:run_fold(roster_process_item,LServer, Item2, [LServer]),
case roster_version_on_db(LServer)
oftrue -> mnesia:write(#roster_version{us = {LUser, LServer}, version = sha:sha(term_to_binary(now()))});
false -> okend,{Item, Item3}end,
case mnesia:transaction(F)
of{atomic, {OldItem, Item}} -> push_item(User, LServer, To, Item),
case Item#roster.subscription
ofremove -> send_unsubscribing_presence(From, OldItem),
ok;_ -> ok end;
E -> ?DEBUG("ROSTER: roster item set error: ~p~n", [E]), ok end end;


 



以上就是一条添加/订阅 好友的iq 消息在ejabberd 中从接收到最终写入到数据库所经过的路径。

 

 

 

 

 

 

 

 

 



  


  
分享到:
评论

相关推荐

    Android IM开发 Ejabberd+asmck+spack

    本项目“Android IM开发 Ejabberd+asmck+spack”提供了一套完整的解决方案,包括服务器端、Android客户端以及PC端客户端。 **Ejabberd服务器** Ejabberd是一款开源的XMPP(Extensible Messaging and Presence ...

    Android使用smack连接ejabberd服务器注册、收发消息

    **五、发送消息** 发送消息涉及到Message类和ChatManager类: ```java Message message = new Message("recipient@your.ejabberd.server.com", Message.Type.chat); message.setBody("Hello, this is a test ...

    ejabberd源码

    ejabberd是一款强大的即时通讯服务器,它基于Jabber/XMPP协议,这使得ejabberd能够支持丰富的交互式通信功能,如文本聊天、音视频通话、群聊、文件传输等。作为一款开源软件,ejabberd遵循GPLv2许可证,允许用户自由...

    android+ejabberd

    IM(ejabberd)服务器的客户端android开发的代码详解,该代码例子包含单聊、群聊、发送文字、发送及接收文件等功能。

    ejabberd 服务器测试客户端spark

    ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统,如即时消息、VoIP、协作工具等。在部署ejabberd服务器后,为了确保其正确配置和功能正常,通常需要一个客户端来进行测试。在这个场景中,"ejabberd ...

    iOS xmpp ejabberd服务器

    此外,ejabberd支持自定义插件,可以满足特定需求,例如日志记录、用户行为分析等。开发者可以根据需求编写插件并与服务器集成。 总的来说,通过使用ejabberd服务器和XMPP协议,开发者可以在iOS应用中构建功能丰富...

    ejabberd服务器安装及客户端注册文档

    在进行IT项目管理时,特别是涉及到服务器安装和客户端注册的场景,ejabberd是一个非常重要的开源即时通讯服务器,它基于XMPP(Extensible Messaging and Presence Protocol)协议,这个协议是国际开放标准用于即时...

    ejabberd windows installer

    3. **模块化设计**:ejabberd具有丰富的插件系统,允许开发者轻松添加新功能或自定义现有功能,例如认证机制、存储后端、路由策略等。 4. **安全**:ejabberd支持SSL/TLS加密,确保数据传输的安全性。此外,还可以...

    ejabberd安装配置[归纳].pdf

    Ejabberd安装配置详解 Ejabberd是一款流行的开源即时通讯服务器软件,具有高度灵活性和可扩展性。下面是Ejabberd安装配置的详细知识点解析: Ejabberd下载 Ejabberd的下载可以从官方网站获取,目前支持多种操作...

    ejabberd-14.07聊天服务器

    4. **模块化架构**:ejabberd的模块化设计允许开发者根据需求添加或移除功能。例如,可以添加实时推送通知、文件传输、多用户聊天(MUC)、私人聊天室等模块。 5. **API接口**:ejabberd提供RESTful API和XML-RPC...

    ejabberd的安装包

    ejabberd安装包,很好的工具!适合安装!一定会很好用的!

    mod_http_offline:ejabberd 模块在用户离线时发送帖子

    Ejabberd 模块在用户离线时发送帖子。 该模块基于 、 以及来自网络的大量代码和技巧,以适应与 Ejabber 14.12 一起使用。 安装 克隆这个存储库: git clone git@github.com:raelmax/mod_http_offline.git 更改...

    ejabberd 群聊 strophe.js 实现

    要深入学习和理解这个demo,你需要阅读和分析这些文件中的代码,理解它们如何与ejabberd服务器交互以及如何展示群聊功能。 总结来说,ejabberd和strophe.js结合使用,可以在Web应用中实现强大的即时通信功能,包括...

    ejabberd安装配置.docx

    五、Ejabberd 配置文件 Ejabberd 的配置文件用于设置 Ejabberd 的参数,例如监听端口、数据库连接等。 Ejabberd 安装配置需要按照安装指南进行安装,配置环境变量,启动 Ejabberd 服务,并使用 ejabberdctl 命令...

    ejabberd-2.1.11

    windows环境下的ejabberd。。。点击即可安装

    Ejabberd-2.1.10-mac

    Ejabberd是一款高度可扩展、安全且可靠的即时通讯服务器软件,主要基于XMPP协议。在标题"Ejabberd-2.1.10-mac"中,我们可以推断这是一份针对Mac平台的Ejabberd服务器软件的特定版本,即2.1.10。这个版本可能包含了...

    ejabberd中mod_privacy_odbc.erl实现没有完全遵循xmpp协议

    ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统。在ejabberd中,`mod_privacy_odbc.erl`是用于处理用户隐私列表模块的一部分,该模块与数据库(通常通过ODBC接口)交互来存储和管理用户的隐私设置。然而...

    ejabberd-15.07-osx-installer.app.zip

    2. **模块化设计**:ejabberd允许通过添加或移除模块来定制服务器功能,如聊天记录、多用户聊天、文件传输等。 3. **分布式部署**:ejabberd可以通过分布式节点进行扩展,适应高并发场景,支持大规模用户群。 4. **...

    ejabberd_rest_client:面向ejabberd的REST客户端

    ejabberd_rest_client是与ejabberd服务器交互的一个客户端库,它利用ejabberd的API接口,通过RESTful方式来操作ejabberd服务器,实现了对ejabberd服务器的远程控制和数据管理。 ejabberd API是ejabberd服务器提供的...

    ejabberd-stanza-ack:ejabberd 13.xx的ejabberd节确认模块

    ejabberd stan ack v0.6 当ejabberd服务器已收到您的消息时,此模块将向您的发件人发送确认/确认消息,而当邮件的收件人已收到您的消息时,此模块将发送另一条确认/确认消息。 在这方面,它提供与移动聊天应用程序...

Global site tag (gtag.js) - Google Analytics