| 
                        副标题[/!--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 函数处理。
   
   
 
 
- %%?Process?packets?sent?by?user?(coming?from?user?on?c2s?XMPP??
  
  - %%?connection)??
  
  - session_established2(El,?StateData)?->??
  
  - ??
  
  - ????%%从变量El中取出Name,Attrs?两个参数,El必须是一个以xmlelement?为第一个元子的元组??
  
  - ????{xmlelement,?Name,?Attrs,?_Els}?=?El,??
  
  - ????%%从StateDate中取出user,server,jid???
  
  - ????User?=?StateData#state.user,??
  
  - ????Server?=?StateData#state.server,??
  
  - ????FromJID?=?StateData#state.jid,??
  
  - ??
  
  - ????%%从Attrs属性变量中获取to(也就是发送给谁)??
  
  - ????To?=?xml:get_attr_s("to",?Attrs),??
  
  - ???????
  
  - ????%%将To转换成一个标准的JID:??
  
  - ????%%#jid{user,resource,luser,lserver,lresource},具体参见jlib.erl中的定义??
  
  - ????ToJID?=?case?To?of??
  
  - ????????""?->??
  
  - ????????????jlib:make_jid(User,?Server,?"");??
  
  - ????????_?->??
  
  - ????????????jlib:string_to_jid(To)??
  
  - ????????end,??
  
  - ??
  
  - ????%%这里的El里的Attrs应该是一个元组组成的列表[{key1,value1},{key2,value2},{key3,value3},{key4,value4}.....]??
  
  - ????%%下面的语句会从Attrs中删除key?为xmlns的元组,并返回新的El存放到NewEl1中??
  
  - ????NewEl1?=?jlib:remove_attr("xmlns",?El),??
  
  - ????NewEl?=?case?xml:get_attr_s("xml:lang",?Attrs)?of??
  
  - ????????""?->??
  
  - ????????????case?StateData#state.lang?of??
  
  - ????????????""?->?NewEl1;??
  
  - ????????????Lang?->??
  
  - ????????????????xml:replace_tag_attr("xml:lang",?Lang,?NewEl1)??
  
  - ????????????end;??
  
  - ????????_?->??
  
  - ????????????NewEl1??
  
  - ????????end,??
  
  - ??
  
  - ????%%这里根据消息类型进行不同的处理??
  
  - ????NewState?=??
  
  - ????case?ToJID?of??
  
  - ????????error?->??
  
  - ????????case?xml:get_attr_s("type",?Attrs)?of??
  
  - ????????????"error"?->?StateData;??
  
  - ????????????"result"?->?StateData;??
  
  - ????????????_?->??
  
  - ????????????Err?=?jlib:make_error_reply(NewEl,??ERR_JID_MALFORMED),??
  
  - ????????????send_element(StateData,?Err),??
  
  - ????????????StateData??
  
  - ????????end;??
  
  - ????????_?->??
  
  - ????????case?Name?of??
  
  - ????????????"presence"?->??
  
  - ????????????????????????%%如果为一个presence?消息,使用函数回调c2s_updatepresence参见2??
  
  - ????????????????PresenceEl?=?ejabberd_hooks:run_fold(??
  
  - ???????????????????????c2s_update_presence,??
  
  - ???????????????????????Server,??
  
  - ???????????????????????NewEl,??
  
  - ???????????????????????[User,?Server]),??
  
  - ?????????????????
  
  - ??????????????????????????%%将调用结果发送回客户端??
  
  - ??????????????????????????ejabberd_hooks:run(??
  
  - ??????????????user_send_packet,??
  
  - ??????????????Server,??
  
  - ??????????????[FromJID,?ToJID,?PresenceEl]),??
  
  - ????????????case?ToJID?of??
  
  - ????????????????#jid{user?=?User,??
  
  - ?????????????????server?=?Server,??
  
  - ?????????????????resource?=?""}?->??
  
  - ?????????????????DEBUG("presence_update(~p,~nt~p,~nt~p)",??
  
  - ???????????????????????[FromJID,?PresenceEl,?StateData]),??
  
  - ????????????????presence_update(FromJID,??
  
  - ????????????????????????StateData);??
  
  - ????????????????_?->??
  
  - ????????????????presence_track(FromJID,??
  
  - ???????????????????????????StateData)??
  
  - ????????????end;??
  
  - ????????????"iq"?->??
  
  - ??????????????????????????%%iq?消息的处理.注册,添加好友等都是通过iq消息来发送的??
  
  - ??????????????????????????case?jlib:iq_query_info(NewEl)?of??
  
  - ????????????????#iq{xmlns?=?Xmlns}?=?IQ??
  
  - ????????????????when?Xmlns?==??NS_PRIVACY;??
  
  - ?????????????????Xmlns?==??NS_BLOCKING?->??
  
  - ????????????????process_privacy_iq(??
  
  - ??????????????????FromJID,?IQ,?StateData);??
  
  - ????????????????_?->??
  
  - ????????????????ejabberd_hooks:run(??
  
  - ??????????????????user_send_packet,??
  
  - ??????????????????Server,??
  
  - ??????????????????[FromJID,?NewEl]),??
  
  - ????????????????check_privacy_route(FromJID,?StateData,?FromJID,?NewEl),??
  
  - ????????????????StateData??
  
  - ????????????end;??
  
  - ????????????"message"?->??
  
  - ????????????????????????io:format("message?arrvied~n",[]),??
  
  - ????????????ejabberd_hooks:run(user_send_packet,??
  
  - ???????????????????????[FromJID,??
  
  - ????????????check_privacy_route(FromJID,??
  
  - ????????????????????????ToJID,??
  
  - ????????????StateData;??
  
  - ????????????_?->??
  
  - ????????????StateData??
  
  - ????????end??
  
  - ????end,??
  
  - ????ejabberd_hooks:run(c2s_loop_debug,?[{xmlstreamelement,?El}]),??
  
  - ????fsm_next_state(session_established,?NewState).??
  
  
 
   
                                                (编辑:52站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |