| 副标题[/!--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).?? 
 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |