【源码学习】Vysper笔记 (一)

来源:互联网 发布:python unpack 和pack 编辑:程序博客网 时间:2024/04/29 12:50

        断断续续翻看了一周Vysper的源码,略有收获吧。之所以说略有,是因为它给我带来的收益没有mina多,mina直接提升了我对java nio、线程池和消息缓冲队列在实际应用方面的认知,并再次发现所有程序中都可见到操作系统所涉及的基本问题和原理,诸如读者写者问题、消息缓冲等等(回头得重新拿起大学时的操作系统教科书看看)。

 

        Vysper源码带给我的收获就是“灵活性”。也许会有人觉得这样很扯,灵活性有什么好说的,但毕竟知易行难,其实“灵活性”三字说的容易,做起来蛮难的。本人写程序时也会努力往“灵活性”这个方向走,但很多时候由于悟性不够高,思考深度不够,最终写出来的程序还是不够灵活,重构又不划算,最终只能尽量微重构了叫喊

 

        正如Vysper在它项目主页中所介绍的“Apache Vysper aims to be a modular, full featured XMPP (Jabber) server.”,模块化是它的最大特性之一,提供了很多接口,如AccountManagement(帐户管理)、OfflineStanzaReceiver(离线消息处理)、RosterManager(通讯录管理)等等,从而非常方便做二次开发,甚至在不需要熟读源码的情况下就可以去整合适用于自己企业的IM了。

 

        下面来说说Vysper的大体运行流程:

        1)客户端连接过来,触发XmppIoHandlerAdapter#sessionCreated方法,从而完成和服务器的连接。

        2)客户端陆续发送一些消息到服务器端,触发XmppIoHandlerAdapter#messageReceived方法(在该方法内,message已经是Stanza类型了,因为数据经过了XMPPDecoder的处理)。

        3)messageReceived方法最终会触发ProtocolWorker#processStanza方法,接着根据stanza类型获取对应的StanzaHandler,尝试处理必要的发送地址改写(发送至其他server的情况)。

        4)在StanzaHandler中根据策略可能会尝试TLS握手&SASL握手,之后就正式开始消息的转发、存储等逻辑(主要就是Message,Presence和IQ)。

                a) 数据若是发送至其他server,会根据stanza的目标地址连接对方server并发送数据。

                b) 数据若是发送至本server内的其他账户,会尝试找出最佳匹配的session再发送数据,当一些类型的数据无法送达时,会根据存储逻辑的设置来决定是否把stanza暂时存起来,方便后面该目标账户连线时可以获取到该stanza。

        5)最后,还有XmppIoHandlerAdapter#exceptionCaught处理异常情况,XmppIoHandlerAdapter#sessionClosed处理连接关闭情况。

 

        好了,Vysper的整个运行结构基本清楚了,下一步就该看看XMPP协议了。是的,我都还没看过协议就开始看Vysper源码了酷,虽然现在最新的是rfc6120,但Vsyper 0.7是基于rfc3920这个已废弃的协议写的,所以我也还是先看看rfc3920好了。(在这里可以推荐一个我近期发现的网站,里面有中文版的XMPP协议,网址是www.jabbercn.org 。)

 

        下一步的目标:了解RFC3920和若干XEP协议,进而开始实现自定义的AccountManagement(帐户管理)、RosterManager(通讯录管理)接口。一个基于企业邮箱通讯录打造的XMPP服务器即将诞生,详见 qiyeliao.com 哦!!!大笑

 

 

        发布在 http://auzll.iteye.com