加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 大数据 > 正文

ejabberd源码分析《三》客户端数据处理

发布时间:2021-05-27 15:00:45 所属栏目:大数据 来源:网络整理
导读:副标题#e# 参考 http://www.cnblogs.com/yjl49/archive/2011/09/02/2371964.html 1.客户端连接服务器后,发送消息给服务器的xml数据处理在ejabberd_c2s中。 ?? ejabberd_c2s 是一个gen_fsm 状态机,在socket连接建立之后创建。 ?? 初始状态为 wait_for_stre
副标题[/!--empirenews.page--]

参考 http://www.cnblogs.com/yjl49/archive/2011/09/02/2371964.html


1.客户端连接服务器后,发送消息给服务器的xml数据处理在ejabberd_c2s中。

?? ejabberd_c2s 是一个gen_fsm 状态机,在socket连接建立之后创建。

?? 初始状态为 wait_for_stream,接受形为 {xmlstreamstart,_Name,Attrs} 的消息,其他任何消息都会导致stop。

?? 接受到连接请求,发送feature 请求后状态改为wait_for_feature_request 。

?? 接受到feature 再发送challenge 后,状态改为 wait_for_sasl_response。

?? 经过sasl鉴权后,状态改为 wait_for_stream, 此时 StateData#state.authenticated 已经不为false。

?? 客户端重新发起<stream> 连接请求,服务器发送bind 消息,状态改为 wait_for_bind 。

?? 客户端发送bind 与资源绑定,服务器按照策略验证是否允许相同的用户用不同的资源连接,通过后状态改为 wait_for_session。

?? 客户端发送<iq> 消息创建session,服务器调用 ejabberd_sm:open_session 后将状态改为 session_established。

?? 客户端发送普通的通信消息<iq>,<presence>,<message> 等,都通过session_established2/2 函数处理。


  1. %%?Process?packets?sent?by?user?(coming?from?user?on?c2s?XMPP??
  2. %%?connection)??
  3. session_established2(El,?StateData)?->??
  4. ??
  5. ????%%从变量El中取出Name,Attrs?两个参数,El必须是一个以xmlelement?为第一个元子的元组??
  6. ????{xmlelement,?Name,?Attrs,?_Els}?=?El,??
  7. ????%%从StateDate中取出user,server,jid???
  8. ????User?=?StateData#state.user,??
  9. ????Server?=?StateData#state.server,??
  10. ????FromJID?=?StateData#state.jid,??
  11. ??
  12. ????%%从Attrs属性变量中获取to(也就是发送给谁)??
  13. ????To?=?xml:get_attr_s("to",?Attrs),??
  14. ???????
  15. ????%%将To转换成一个标准的JID:??
  16. ????%%#jid{user,resource,luser,lserver,lresource},具体参见jlib.erl中的定义??
  17. ????ToJID?=?case?To?of??
  18. ????????""?->??
  19. ????????????jlib:make_jid(User,?Server,?"");??
  20. ????????_?->??
  21. ????????????jlib:string_to_jid(To)??
  22. ????????end,??
  23. ??
  24. ????%%这里的El里的Attrs应该是一个元组组成的列表[{key1,value1},{key2,value2},{key3,value3},{key4,value4}.....]??
  25. ????%%下面的语句会从Attrs中删除key?为xmlns的元组,并返回新的El存放到NewEl1中??
  26. ????NewEl1?=?jlib:remove_attr("xmlns",?El),??
  27. ????NewEl?=?case?xml:get_attr_s("xml:lang",?Attrs)?of??
  28. ????????""?->??
  29. ????????????case?StateData#state.lang?of??
  30. ????????????""?->?NewEl1;??
  31. ????????????Lang?->??
  32. ????????????????xml:replace_tag_attr("xml:lang",?Lang,?NewEl1)??
  33. ????????????end;??
  34. ????????_?->??
  35. ????????????NewEl1??
  36. ????????end,??
  37. ??
  38. ????%%这里根据消息类型进行不同的处理??
  39. ????NewState?=??
  40. ????case?ToJID?of??
  41. ????????error?->??
  42. ????????case?xml:get_attr_s("type",?Attrs)?of??
  43. ????????????"error"?->?StateData;??
  44. ????????????"result"?->?StateData;??
  45. ????????????_?->??
  46. ????????????Err?=?jlib:make_error_reply(NewEl,??ERR_JID_MALFORMED),??
  47. ????????????send_element(StateData,?Err),??
  48. ????????????StateData??
  49. ????????end;??
  50. ????????_?->??
  51. ????????case?Name?of??
  52. ????????????"presence"?->??
  53. ????????????????????????%%如果为一个presence?消息,使用函数回调c2s_updatepresence参见2??
  54. ????????????????PresenceEl?=?ejabberd_hooks:run_fold(??
  55. ???????????????????????c2s_update_presence,??
  56. ???????????????????????Server,??
  57. ???????????????????????NewEl,??
  58. ???????????????????????[User,?Server]),??
  59. ?????????????????
  60. ??????????????????????????%%将调用结果发送回客户端??
  61. ??????????????????????????ejabberd_hooks:run(??
  62. ??????????????user_send_packet,??
  63. ??????????????Server,??
  64. ??????????????[FromJID,?ToJID,?PresenceEl]),??
  65. ????????????case?ToJID?of??
  66. ????????????????#jid{user?=?User,??
  67. ?????????????????server?=?Server,??
  68. ?????????????????resource?=?""}?->??
  69. ?????????????????DEBUG("presence_update(~p,~nt~p,~nt~p)",??
  70. ???????????????????????[FromJID,?PresenceEl,?StateData]),??
  71. ????????????????presence_update(FromJID,??
  72. ????????????????????????StateData);??
  73. ????????????????_?->??
  74. ????????????????presence_track(FromJID,??
  75. ???????????????????????????StateData)??
  76. ????????????end;??
  77. ????????????"iq"?->??
  78. ??????????????????????????%%iq?消息的处理.注册,添加好友等都是通过iq消息来发送的??
  79. ??????????????????????????case?jlib:iq_query_info(NewEl)?of??
  80. ????????????????#iq{xmlns?=?Xmlns}?=?IQ??
  81. ????????????????when?Xmlns?==??NS_PRIVACY;??
  82. ?????????????????Xmlns?==??NS_BLOCKING?->??
  83. ????????????????process_privacy_iq(??
  84. ??????????????????FromJID,?IQ,?StateData);??
  85. ????????????????_?->??
  86. ????????????????ejabberd_hooks:run(??
  87. ??????????????????user_send_packet,??
  88. ??????????????????Server,??
  89. ??????????????????[FromJID,?NewEl]),??
  90. ????????????????check_privacy_route(FromJID,?StateData,?FromJID,?NewEl),??
  91. ????????????????StateData??
  92. ????????????end;??
  93. ????????????"message"?->??
  94. ????????????????????????io:format("message?arrvied~n",[]),??
  95. ????????????ejabberd_hooks:run(user_send_packet,??
  96. ???????????????????????[FromJID,??
  97. ????????????check_privacy_route(FromJID,??
  98. ????????????????????????ToJID,??
  99. ????????????StateData;??
  100. ????????????_?->??
  101. ????????????StateData??
  102. ????????end??
  103. ????end,??
  104. ????ejabberd_hooks:run(c2s_loop_debug,?[{xmlstreamelement,?El}]),??
  105. ????fsm_next_state(session_established,?NewState).??


(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读