首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

飞信Client跟MapleFetion项目的登录模块浅析

2012-12-19 
飞信Client和MapleFetion项目的登录模块浅析题记:????? 反正闲着还是闲着。以下分析基于MapleFetion2.5版本

飞信Client和MapleFetion项目的登录模块浅析

题记:

????? 反正闲着还是闲着。以下分析基于MapleFetion2.5版本。

?????

??? 以前在DD的时候,XX做了一个告警短信系统,后来问了下孙总,他说只是XX提供了接口,应用这边给个文件就好了。所以此路XXX了。

?

??? 最早研究起Fetion的大哥应该是邓东东,记得之前面试我还提到过他的名字,他的LibFetion也是自己做黑盒分析做出来的,算是第三方最好的了,也做了很久,用c写的,见http://www.libfetion.org 原是本着美好的愿望,希望大家在此基础上开发更好的应用,无奈由于非技术原因,不提供对外的so库,特别是windows版本的,你懂的....

??? 虽然不对外提供so库,但却出了各个平台的飞信app应用了。国家要有个无私奉献奖就好了。

???

??? 听说飞信是MSN那帮人做的,而且做法有很多相似的地方。在2007年的时候nathan大哥也对其研究了一番,见他博客http://hi.baidu.com/nathan2007/home,他的博客要是被那帮开发人员看见了,估计会喷血。我想nathan的博客对后来研究飞信的人提供了很大的帮助。其中一个就是MapleFetion项目了,作者solosky也是做了一番苦心的研究,最终开发了一个功能较全的三方lib,并且开源出来了,我觉得这对飞信本身的发展是利大于弊的。

?

??? 根据nathan大哥的黑盒分析,了解到fetion用到非标准的SIP协议+HTTP协议,在SIP上做了一点改动,感觉是被阉了,并改名叫SIPC。

??? 飞信的登录模块有2次验证:

??? 1、SSI验证

??? 通过HTTPS的GET方式通讯,URL为:https://uid.fetion.com.cn/ssiportal/SSIAppSignInV2.aspx?mobileno=159********&domains=fetion.com.cn%3bm161.com.cn%3bwww.ikuwa.cn&digest=89405402A0FC1A2FC73681229FB134E9638C4D5986C65BC9

?

digest后面那段是密码。

?

得到SIP:123456@fetion.com.cn;p=6721,结果码,和一个Credential

类似如下:

?

?

登录代码为:LoginState state = client.syncLogin();

登录主要类为:LoginWork.java

?

?LoginWork的工作包括了2次身份验证。完成了上一步,就开始SIPC的交互过程了,另外你可以不走SSI验证过程,但是你就必须得知道你的Fetion号,而非手机号。

?

SSI身份验证是类SSISignV2.java实现的,主要工作就是生成URL,发送HTTPS请求,接收HTTPS返回的结果,并解析,代码很简单,就不贴了。

SIPC验证是ServerDialog.java实现的,他主要工作是与飞信服务器进行通讯,其中包括消息的构造和发送。

?

在FetionClient初始化时会建立几个工厂:

?

public FetionClient(String account,
??????String password,
??????NotifyEventListener notifyEventListener)
?{
??this(new User(account, password, "fetion.com.cn"),
????notifyEventListener,
????new AutoTransferFactory(),
????new SimpleFetionStore(),
????new ThreadTimer(),
????new SingleExecutor());
?}

?

关于登录的运行有点怪怪的,作者用一个?new SingleExecutor()(实际上是一个1.5的单线程池:Executors.newSingleThreadExecutor();)来执行LoginWork。

?

?

2、开始SIPC验证

?????前面分析到,与服务器的SIPC通讯主要是ServerDialog实现的,而他由DialogFactory工厂模式创建。

???? 和其他协议消息一样,消息分为头+消息体,由MessageFactory消息工厂创建,然后通过TCP,HTTP,MINA等底层通讯平台发送,消息被封装为SipcRequest.java,SipcResponse.java和SipcReceipt.java里。

?

??? MessageFactory.java的主要作用就是构造一个个消息,消息构造就不贴代码了,很多硬编码了。?

?

??? 构造好消息后,传给上层ServerDialog.java,并由ServerDialog通过发送模块发送出去,并注册监听器。这个看得有点头昏,需要关注下,代码如下:

?

 protected void sendBytes(byte[] buff, int offset, int len)            throws TransferException    {    try {        this.writer.write(buff, offset, len);        this.writer.flush();        } catch (IOException e) {       throw new TransferException(e);        }        }

?

?这种把处理模块做成双链表的设计模式感觉还是有利有弊:),还是等待大大点评下吧。?

?

1 楼 C_J 2010-11-16   <div class="quote_title">solosky 写道</div>
<div class="quote_div">HI CJ.Yang:<br>   ProcessorChain是从设计模式中的职责链设计模式变化而来的,通过在这条双向的链表上传递一个对象,每个处理器可以进行处理或者替换后交给下一个处理器,也可以直接切断处理链。这样做是为了形成类似于堆栈似的协议处理,而且有明显的分层,每一层都完成独立的处理,下面是maplefetion的处理链的结构,或者叫处理栈更贴切些:<br><br>Dialog  //最顶层,发起某一个操作,比如添加好友,会构建一个SipcRequest传递给下一层,并且捕获所有的异常和处理<br>   ↓↑<br>MessageDispatcher  //路由从底层传递上来的SipcNotify和SipcResponse,调用NotifyHandler和ResponseHandler<br>   ↓↑<br>SipcLogger     //记录所有和服务器交互的Sipc信令,便于调试<br>   ↓↑<br>TransferService // 管理Sipc信令的传输,处理超时和重传,以及SipcResponse和SipcRequest的配对<br>   ↓↑<br>SipcParser     //解析底层传递过来的字节数组为单独的Sipc信令,并交个上层处理,和把上层传递过来的Sipc信令转为字节数组,交给下层发送;<br>   ↓↑<br>Transfer    //发送和接受网络传递的字节数组<br><br>通过这种处理链的方式,可以很容易构建起分层的处理结构,并且可以很方便的在这个处理链上添加新处理器来添加新的功能,很容易维护。<br>缺点嘛,暂时没想到,呵呵。 <br><br>如果你看过Tomcat的源码,其实里面的Valve也是一个处理链的结构,对于每一个请求都会在有Valve构成的链表中传递和处理,还有Filter也是。<br>希望对你有所帮助。</div>
<p>?</p>
<p>?</p> 2 楼 agapple 2010-11-17   对协议分析是个体力活

http://agapple.iteye.com/blog/813225,个人的一个fetion lib使用记录,直接用的是一个别人的lib库 3 楼 zhhaogen 2010-11-17   很少人研究第三方qq么?

热点排行