前言
我只是列举了一个我目前解决不了的问题,希望大家看了我的分析能够一起解决。
前提条件:
反编译了Fetion的官方源码,这个没什么难度,下载个Reflector就实现了项目的反编译。
废话先说说:
首先发发牢骚,飞信的核心代码写的还算可以,可是到了应用层之后就非常的烂,和实习生的水平差不多,中国移动也真是惨,不懂技术就被微软玩的团团转。举个例子,竟然在user这个级别硬生生插入了个persistencyManager,硬生生的去持久化数据。
这个完全可以用设计模式解决的,却自己和自己绕来绕去。愚蠢!
还有在user.status里面的set,反编译后可以看到一堆的代码,一个赋值操作又被捆绑了一堆逻辑,不知道是fetion小组哪个白痴的杰作。搞到我debug的时候绕了半天才发现这里操作了sqllite。
正文:
连接核心在imps.CLient.CommLayer.ConnectionManagerImp里面。就是CreateSipConnection。
他核心使用了3个连接去尝试,包括:TcpSipConnection / HttpSipConenction / HTSipConnection
当设置了UsrDirect的连接方式,就启动TcpSipConnection
其余的都是默认必须执行
官方的飞信实际上使用了HttpSipConnection,可惜我调试了半天发现这个连接没有被启动,估计哪里出现了exception,微软的狗屎代码又没有去catch,然后直接停止了这个连接的启动。
网上很多人说官方的代码一段时间会掉线,就是因为没有启动HttpSipConnection,他里面有个5秒钟的轮训发送SIPP,保持连接(用HttpAnalyzer就可以看到)
大概过程:
1.登录的时候,loginFramework调用了DoLogin方法,初始化了一堆LoginAction
2.其中有个是sipcTunnelAction 是个关键,就是实际连接远程的服务器
3.当sipcTunnelAction.Execute(),就会调用ConnectionFactory去创建SipConnectionImp,同时就初始化了HTSipConnection / HttpSipCOnnection。并且开始连接。
4.首先是启动HTSipConnection
现在的问题就是官方的程序能够启动HTtpSipConnection,但是我反射后的代码不能。
我作了如下测试:
如果我把官方所有的配置文件删除了去启动,第一次也是没有启动HttpSipCOnnection,但是会自动修复配置文件,第二次启动的时候就能够回复httpsipconnection。
这个就是关键。
希望有兴趣的朋友帮忙继续研究下去!