【www.shanpow.com--工作计划】
一:[软件实现]软件的实现过程
http://www.cnblogs.com/riskyer/p/3423977.html
上篇博客谈到了软件计划阶段所要做的一些工作,也阐述了计划阶段工作的重要性,为以后开发阶段提供了很好的原材料,正如有了孙悟空有了前期七十二变的修炼,终于要开始征途了,下面就谈一下软件成形的过程。
软件的形成
前
在编码前,我们也需要做好一下几项工作。
程序语言
程序员的知识:在选择程序语言时,要选择程序员熟练的语言。
工程的规模:如果工程规模较大的话,可以自己设计自己的语言。
运行环境:要选择系统运行环境稳定的语言。
代码规范
对于程序员编制的代码一定要提前统一好标准,防止以后互相连接的过程中出现一些出错。
一个好的程序员的代码应该有适当的注释,代码清晰,可读性强
界面设计
对于界面设计的风格,应该要按照用户的不同要求来相应的设计。在保证可靠性的前提下,按照用户的不同知识程度、喜好程度、灵活性来设计合理的界面,防止界面过于炫丽。
中
代码效率
真正进入到编码过程中的时候,首要的问题莫过于效率问题了。有如下几个注意要点。
1.算法要合理。
2.代码简单优化。
3.分快编写,然后再集成。
4.数据类型要统一
5.尽可能使用伪代码来描述程序的流程
设计方法
结构化设计方法
就是从程序的结构出发,采用模块结构图的方式来表示程序模块之间的关系。
面向对象的设计方法
就是把软件中看见的实体称之为对象,他们的功能称之为属性。多个对象的集合就称之为类。对象与对象之间通过消息产生沟通。这样就是问题简单化了,我们要做的是找到类,通过消息来建立他们之间的连接,通过属性来实现系统的功能。
后
测试
是用来确认一个系统的品质或者性能是否符合用户提出的要求标准。
原则
尽早地并且不间断的进行软件测试
避免测试自己的程序
设计测试用例时,条件应该齐全。
保存测试记录。
步骤
单元测试:对源代码实现的一个程序单元进行测试,检查各个程序模块是否实现了其功能。
集成测试:对组装后的软件进行测试。
确认测试:检查已实现的软件是否满足了各种需求,以及配置是否完全正确。
系统测试:把通过的软件纳入到运行环境中,与其他系统组合在一起进行测试。
方法:
黑盒:把程序当作一个不能打开的盒子,检查功能是否正常使用。
白盒:软件透明化,测试内部的逻辑结构。
还有值得我们注意的是以上的测试过程需要形成一份软件测试的需求规格说明书。
未完待续……
二:[软件实现]android聊天软件的实现
doc一.聊天软件背景
1.聊天软件,就是通常我们说的即时聊天工具IM,我们常用的聊天软件有QQ,微信,飞信等。 2.需要协议支持,传统的socket编程并不满足聊天的功能,比如服务器与客服端的双向交互,消息的双向推送。 3.在移动互联网时代,我们需要基于移动终端开发新型的聊天软件,以满总大众的需求,常用的移动设备终端操作系统ios,android,wp7等等。
二.技术背景
1.在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案, 可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。 在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。 Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的 、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。 C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。 但是经过一番研究发现,这个服务存在很大的问题: 1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统; 2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用, 我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的; 有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。
即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:
1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。
2)SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/。
3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。
前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来
三.开发协议 1.目前主流的四种IM(IM:instant messaging,即时消息)分别为: XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议); 即时信息和空间协议(IMPP); 空间和即时信息协议(PRIM); 针对即时通讯和空间平衡扩充的进程开始协议SIP(SIMPLE)。
2.在这四种协议中,XMPP是最灵活的。 XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。 经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程 序。 而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能.
3.XMPP系统特点: (1)客户机/服务器通信模式; (2)分布式网络; (3)简单的客户端; (4)XML的数据格式。
三.协议的实现及开发工具包 1.android使用xmpp协议进行即时通信,所涉及3个主要的东西,它们是openfire、Asmack和spark,这三个东东结合起来就是完整的xmpp IM实现:
(1)基于java的开源XMPP协议包Asmack,在pc机上,有实现XMPP协议包smack,但在精简了jdk的android系统上,会出现一些类缺失, 但在2010年初,有人在code.google.com网站上发布了一个Asmack,其中A库就代表Android中的A,也就是说,这个版本是Smack的Android版本. 可使用下面地址下载Asmack. http://code.google.com/p/asmack/downloads/list
(2)openfire主要是作为服务器,负责管理客户端的通信连接,以及提供客户端一些通信信息和连接信息。 (3)Spark 是PC机上IM客户端的实现,其实就是使用了smack 的api实现的。 (4)官方下载:http://www.igniterealtime.org/downloads/index.jsp
四。参看资料 http://www.apkbus.com/android-23750-1-1.html
三:[软件实现]软件网络认证的实现(附源码)
目前很多软件都是通过网络验证来实现的,一种比较流行的方式便是把服务器端(如验证网页)放在服务器上,软件为客户端,当软件注册或启动时通过网络与服务器端进行数据交换,重新实现验证的目的。
个人觉得网络验证将是一种趋势,做得好的网络验证方式将是对软件的一种极大保护,如把软件的关键数据或关键代码放在服务器端,当认证通过后再发回到软件,且在传输过程中都用比较成熟的大型算法加密,从而达到一种防破解的目的。举个简单的例子,软件SMC加传输数据的RSA加密便是一个强度还可以的保护。
这段程序只是一个示例,显示其最简单的实现方式,程序很好的可移植性和很大的发挥空间。
服务端为一个验证网页Conn.asp,getinfo.asp,data.mdb,只需把它放至空间上,其中访问getinfo.asp的格式为:getinfo.asp?username = XXXXXXX & password = XXXXXXX,(XXXXXX表示需要提交确认的用户名和密码)。
软件的实现方式为经典的wininet编程,其流程(类似closehandle之类的就不列出来了)基本上为:
1,hInternet = OpenInternet ()
2,hConnection = OpenConnection (hInternet, szUrl, szUsrName, szUsrPwd) ;
3,hRequest = OpenRequest (hConnection, HttpTool::szPost, szUrl, dwFlags, szReferer) ;
4,AddRequestHeader (hRequest) ;
5,SendRequest (hRequest, dwTotalByte.Value ()) ;
6,EndRequest (hRequest)
通过反汇编分析发现其实SendRequest 后内存中即已发现返回包的值,接下去便为对接受到的包的读取部分,分别为其头部和内容部分的读取,再根据实际返回值判断用户名或密码是否正确。
以上即是对网络验证的最简单的实现,详细内容见源代码(目前源代码中wininet部分为Ryeol的封装类,佩服他的完美封装)。
源文件下载地址:http://download.csdn.net/source/2397243

