




免费预览已结束,剩余35页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于J2ME的手机流媒体音频播放器的开发网络通信模块设计与实现基于J2ME的手机流媒体音频播放器开发网络通信模块设计与实现摘 要 移动技术正在改变我们的生活和工作方式。它们是塑造未来经济和社会的真正革命性力量。随着智能可编程设备和高速无线网络的日益普及,它们为软件开发人员创造了巨大的机会。本文简单阐述了一个基于J2ME的手机流媒体音频播放器的开发。该播放器通过Web Service提供的服务实现流媒体URL的获取并播放以及用户与服务器的互动操作,用户可以用手机参与节目的投票、推荐给自己的好友等。本文分为六部分:第一部分分析了手机流媒体的应用前景并对文章结构进行了简单的介绍。第二部分介绍了系统的开发平台和系统用到的相关技术。第三部分介绍了播放器的设计,包括系统的总体设计目标,系统流程,系统的结构框架,系统的硬件平台;最后还对系统的各个模块进行了简单的介绍分析。第四部分详细介绍了网络通信模块。第五部分介绍了系统测试及结果,包括单元测试,集成测试和系统测试。第六部分对全文的内容进行了总结。关键字 流媒体音频 J2ME SOAP KXML37J2ME-based mobile phone streaming audio player developmentDesign and Implementation of Network communication moduleAbstract: Mobile technology is changing our way of life and work. They are shaping the future economic and social strength of the real revolutionary. With intelligent programmable high-speed wireless network equipment and the growing popularity of their software development staff to create a huge opportunity. This paper described a simple J2ME-based mobile streaming audio player development. The players through the Web Service to provide the service to achieve access to streaming media URL and audio and user interaction with the server operation, the user can program the phone to participate in the voting to recommend to their friends and so on. This paper is divided into six parts: the first part of the mobile streaming media applications and prospects of the article structure of a simple introduction. The second part of the system on the development of platforms and systems used in related technologies. The third part of the players on the design, including system design objectives, system processes, the systems structural framework, the systems hardware platform; Finally, the systems various modules on a simple analysis. Part IV details of the network communication module. Part V introduced the system testing and results, including unit testing, integration testing and system testing. Part VI of the contents of the full text of a summary. Keywords: Streaming audio; J2ME; SOAP; KXML目 录第一章 绪论11.1应用前景分析11.2本文的主要内容及组织1第二章 开发平台及相关技术22.1系统的开发环境平台22.2系统的相关技术介绍4第三章 播放器的总体设计83.1系统总体设计83.2系统模块设计11第四章 网络通信模块的详细设计194.1 网络通信模块的总体设计194.2 HTTP协议连接204.3 SOAP访问234.4 J2ME中XML的解析25第五章 测试及结果295.1 单元测试295.2 集成测试305.3 系统测试31第六章 总结34致谢语35参考文献36第一章 绪论1.1应用前景分析手机流媒体节目的推出是手机多媒体时代的重要标志,将使得手机成为继收音机、网络之后的第三种语音载体广播工具。上班族可以在上下班的途中收听新闻;在校学生可在晨练时收听英语广播练习听力、口语;商务人士可以在候机厅、火车上收听最新的股市行情;球迷朋友可以在第一时间了解国内外体坛快讯,还可以发送自己喜爱的节目与朋友分享手机流媒体节目在很大程度上满足了广大消费者与日俱增的信息需求。目前,基于手机终端的移动交互式正在成为移动运营商的香饽饽。无论是国内运营商还是海外的运营商争相推广此项新业务,并将其作为3G时代的重要业务加以发展与规划。这种移动交互式业务,最吸引人的地方,就在于将手机用户与广播节目之间的互动变得更为直接和丰富。例如,当节目正在播放时,用户的手机上会显示收录该节目的名称、节目的描述信息等信息。用户可以用手机参与投票、推荐给自己的好友等。这种交互方式让手机流媒体变得更加贴近听众,而且为移动运营商创造更多的收入来源。1.2本文的主要内容及组织本文分为六部分。第一部分介绍了手机流媒体的现状并进行了简单的介绍。第二部分介绍了系统的开发平台和系统用到的相关技术。第三部分介绍了播放器的设计,包括系统的总体设计目标,系统流程系统的结构框架,系统的硬件平台最后还对系统的各个模块进行了简单的介绍分析。第四部分详细介绍了网络通信模块。第五部分介绍了系统测试及结果,包括单元测试,集成测试和系统测试。第六部分对全文的内容进行了总结。第二章 开发平台及相关技术2.1系统的开发环境平台2.1.1 Eclipse平台简介Eclipse可以用来开发Java应用程序、Web应用程序,甚至是C+程序,因为Eclipse平台是一个开放的平台,可以通过加载插件实现功能的扩充。Eclipse的核心被设计为可以动态发现、装入和运行插件,平台中的每个子系统本身是有实现某些关键功能的一组插件构建的,安装不同的插件可以使得Eclipse具有不同的功能和开发能力。Eclipse平台小组JDT(Java开发工具)PED(插件开发者环境)工作台JfaceSWT工作空间平台运行时帮助图2-1 Eclipse开发包的结构Eclipse开发包的结构如上图所示。Eclipse开发包中有两个主要的部分:Eclipse平台和插件工具。插件开发工具主要有2个,其中Java开发工具(JDT, Java Development Tooling)实现了功能完整的Java开发环境;插件开发者环境(PDE, Plug-in Developer Environment)添加了专门的工具使插件和扩展的开发能够顺利进行。在Eclipse平台中,平台运行时(Platform Runtime)通过OSGi框架实现,关于OSGi的详细信息可以访问/获得。平台运行时定义了平台的扩展点和插件模型,使得开发人员能够进行Eclipse插件开发。开发出来的插件由平台运行时根据平台注册表中的信息动态地发现和加载。工作空间(Workspace)可以进行资源管理,例如管理项目、文件和文件夹等资源。工作站(Workbench)提供了定义用于添加用户界面组件(例如,试图或菜单操作)的扩展点。帮助(Help)定义了帮助文档的扩展点,插件的帮助文档或者其他文档都可以集中在帮助系统中。小组(Team)定义了用于管理资源和设置资源版本的小组编程模型。2.1.2 CLDC 和 MIDP平台CLDC1.0(JSR 30)规范在1999年秋到2000年春完成并发布,共有18个知名厂商成员参与了规范的制定。业界知名公司的鼎力支持确保了CLDC可以为开发者提供一个标准化、需要最小足迹(footprint)、针对资源受限设备的应用程序开发平台。CLDC的推出使得第三方开发者为移动终端设备开发应用程序,以及动态下载应用和内容到移动终端成为可能。这也是制定CLDC的一个重要目标。MIDP(Mobile Information Device Profile,移动信息设备简表)是为移动电话和入门级PDA设计的。它为移动应用程序提供了所需的全部核心功能,包括应用程序模型、用户界面、持久性数据存储、联网能力(通用连接框架定义在CLDC中,在MIDP中实现)及应用程序管理。目前应用非常广泛的MIDlet就是在MIDP中定义的。CLDC和MIDP组成的完备Java运行环境提升了手持设备的能力,并且最小化了设备内存和电源的能耗。2.1.3 Nokia开发者平台Series60介绍Series 60 Platform向消费用户提供了最上乘的智能手机体验。在范围广泛的终端设备上实现的Series 60 Platform向应用及媒体开发伙伴们提供了统一完整的技术组合。它在提供各种高级企业应用、游戏,及音乐方面驾轻就熟,同样,它也向为开发伙伴们提供了移动领域中无与伦比的众多机会。应用开发伙伴们可以用C+ (使用各种本地Symbian OS API)、Java 语言(使用具有大量附加Java 规范请求JSR的移动信息设备描述MIDP1.0 或MIDP 2.0),或Python进行开发。所有这些都得到了开放移动联盟(OMA)数字版权管理(DRM)的支持,以保护开发伙伴的知识产权。到2005年5月,已经有2千5百多万台Series 60 Platform终端供应市场,而这仅仅是Series 60 Platform走向大销量的开端。Series 60 Platform帮助开发伙伴们创建具有更高价值的应用和内容,从而提高获利机会。这一平台方案具备统一的技术实现和支持工具、文档,及范例,从而使开发伙伴们事半功倍地把握各种市场机会。2005年2月,诺基亚宣布了Series 60 Platform 的下一版本。基于精湛的Symbian OS v9的Series 60 Platform 3rd Edition中集合了多种特性和功能,令开发伙伴们能进入众多新市场,让自己的应用软件能发挥更佳性能,并提升应用软件的集成度。2.1.4 CVS协作开发工具CVS (Concurrent Versions System)是基于TCP/IP协议的版本控制工具。CVS是一个并行版本控制系统,它采用C/S模式,它的复杂度和功能性属于中等,是当今最流行的版本控制系统。2.2系统的相关技术介绍2.2.1 J2ME技术简介J2ME即JAVA 2 Micro Edition,它是Java 2的组成部分,与J2SE、J2EE并称。J2ME是一种高度优化的Java运行环境,应用于大量的消费类电子设备,如Cellular Phones(蜂窝电话)、Screen Phones(可视电话)、Digital Set-top Boxes(数字机顶盒)、Car Navigation Systems(汽车导向系统)等,同时也广泛被移动通信设备所采用,如移动电话、双向寻呼机、智能卡、个人电脑记事本(Personal Organizer)和掌上电脑(Palmtop)等。J2ME技术将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。2.2.2 SOAP技术简介SOAP定义了一种在HTTP客户端和服务器端传输命令和参数的机制。SOAP不关心什么操作系统、编程语言或在服务器端或客户端使用的对象模型:除了需要使用HTTP传输外,与其他无关。SOAP是简单的。客户端发送一个请求给服务器,调用相应的对象,然后服务器返回结果。这些消息是XML格式的,并且封装成符合HTTP协议的消息。SOAP通过已有的Internet下层结构来工作。你不需要作任何工作,它符合任何路由器、防火墙或代理服务器。SOAP客户请求封装在一个HTTP POST(或M-POST)包中。SOAP定义了两种类型的消息,请求和响应,从而允许客户端能够递交一个远端请求,允许服务器端能够响应这些请求。SOAP不需要任何对象模型,也不需要通过其他的通讯实体来使用对象模型。在避免对象模型的基础上,SOAP将大部分对象功能(如初始化代码和垃圾堆积)留给客户端和服务器端工作的底层,同时其他功能(如信号编辑)则可以留给SOAP综合已有的应用程序和底层结构来完成。SOAP可以使用任何语言来完成,只要客户端发送正确SOAP请求(也就是说,传递一个合适的参数给一个实际的远端服务器)。SOAP没有对象模型,应用程序可以捆绑在任何对象模型中。早期实现SOAP功能的有Java, Perl, 和Windows版本。当将每个功能变为SOAP实体能够理解的参数和响应后(例如,数据保存在一个XML元素中,并封装在HTTP消息中),它就可以和其他的SOAP功能交互作用。2.2.3 Web Service简介Web Service是为实现“基于web无缝集成”的目标而提出的全新概念,希望通过Web Service能够实现不同的系统之间能够用“软件-软件对话”的方式相互调用,打破软件应用、网站和各种设备之间格格不入的状态。Web Service是一个应用程序,它向外界暴露一个能够通过Web进行调用的API,这就是说,能够用编程的方法通过web调用来实现某个功能的应用程序。Web Service是一种新的Web应用程序分支,它们是自包含、自描述,模块化的应用,可以在网络中被描述、发布、查找以及通过Web调用。Web Service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同的平台、编程语言和组建模型中的不同类型系统。可扩展性标记语言XML是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它基于平台无关,由于厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD定义了一套标准的数据类型,并给出了一种语言来拓展这套数据类型。Web Service平台是用XSD来作为数据类型系统的。当用某种语言如VB.NET 或C#来构造一个Web Service时,为了符合Web Service标准,所有使用的数据类型都必须被转换为XSD类型。如想让他使用在不同的平台和不同的软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是上面谈到的SOAP协议。Web Service描述语言(WSDL)是用计算机能阅读的方式提供的一个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。UDDI即统一描述、发现和集成(Universal Description , Discovery , and Integration),其目的是为电子商务建立标准,UDDI是一套基于Web的、分布式、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组是企业能将自身提供的Web Service注册,可以使别的奇特能够发现访问间协议的实现标准。Web Service本身其实是在实现应用程序的通信。现在有两种应用程序通信的方法:RPC远程过程调用和信息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常的方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的端口,而客户端就好像在本地使用这些对象的接口一样,这样就隐藏的底层的信息,客户端也就根本不需要知道对象是在哪台机器上。第三章 播放器的总体设计3.1系统总体设计3.1.1 总体目标本项目设计的是一款能在手机上收听全球流媒体音频节目的播放器。该系统基于J2ME平台,通过移动网络与Web Service服务器和音频节目服务器进行交互,集成了节目列表浏览、节目点评推荐和流媒体播放功能。本软件在开发实现过程中采用模块化、结构化的软件设计思想,采用MVC模式来组织系统总体框架,提高了系统的可移植性和可维护性。利用MMAPI实现对HTTP协议传输的MP3格式音频流的解码,使用多线程技术,实现在播放缓冲区中音频数据的同时,不断地从服务器下载后续音频数据到客户端缓冲区,即“边下载,边播放”,给用户带来“实时播放”的业务感知体验。系统实现了以下目标:1.实现手机上对HTTP流式传输的MP3格式流媒体音频的解析和流畅播放。2.可以通过Web Service实现手机网络流媒体节目播放软件与门户系统的互动和信息传递。3.可以收听全球网络的流媒体节目,按国家、语言、格式对节目进行分类和搜索。4.实现节目收听排行榜和用户收听偏好设置。5.实现跨机型、跨品牌的通用性(主要面向中、高端的智能手机)。6.实现系统代码的可维护性和可移植性。7.美观、时尚、易用、人性化的用户界面。3.1.2系统流程图图3-1 系统流程图3.1.3 MVC结构框架本系统的整体遵循了模型-视图-控制器(MVC)模式,MVC模式是“Mode-view-Controller”的缩写,MVC应用程序总是由这三个部分组成。视图即view)代表用户交互界面,模型(Model)就是业务流程状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。控制(Controller)可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Model的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能,如图3-2所示。视图选择用户请求状态改变通知改变状态查询模型(Model)封装应用程序状态相应状态查询应用程序功能通知视图改变视图(View)解释模型模型更新请求发送用户输入给控制器允许控制器选择视图控制器(Controller)定义应用程序行为用户动作映射成模型更新选择相应的视图方法调用事件图3-2 MVC组件类型的关系和功能3.1.4 系统运行平台为了能够运行这一软件,手机设备需要满足一定的软硬件配置。如下:(1)MIDP 2.0(2)CLDC 1.0/1.1(3)MMAPI 1.1(MP3 Support),JSR 135(4)Memory heap size800 KB(5)Protocols: http、socket(6)MIME Types: audio/mp3、audio/wav(7)GPRS当前的中、高端手机设备均已达到或超过以上所列配置标准。3.2系统模块设计3.2.1 UI界面模块J2ME中的LCDUI提供了高级界面API和低级界面API以满足不同开发人员的需要。高级API很容易学习和使用。它的目标是支持快速开发周期,并且使用高级API更容易编写可移植的代码。而低级API为开发人员提供原始的能力和弹性,这些开发人员需要控制用户体验的每一个方面。高级API的设计目标是支持跨设备的可移植应用程序。他在高度抽象水平上提供了一套标准的UI类,这些代表基本的UI组件。设备实现了这些组件,因此使用高级API编程的应用程序采用该设备的本地化界面。例如S60和S40设备通常根据它们自己的UI原则,不一样的实现同样的窗口小部件。但是,高级UI方法的缺点也很明显:开发人员对显示的详细信息几乎没有控制,并且不能超出预定义的窗口小部件组件集合的范围。例如,很难仅仅使用高级API开发动画屏幕。低级API是开发人员可以完全控制整个设备的现实,包括在任何一个像素上的绘制,产生基本的形状以及使用特殊的字体显示文本。低级API还支持比高级API更丰富的用户交互,高级API只捕获软键事件。低级API为开发人员提供机制,以处理所有键盘的按键事件和指针移到。自定义显示和事件处理对游戏开发人员开发至关重要。低级UI应用程序需要显示它自己,而不是将任务委派给程序运行库。因此,低级API应用程序通常要求比高级API应用程序拥有更多的代码。将UI应用程序移植到不同的设备有时是一件单调乏味的任务。例如,很难使用像素级工具实现一个具有本地观感的文本输入框。另外,使用低级API实现的文本输入框可能没有即用型高级API组件一样的性能。综合以上高级API和低级API的各自特点的考虑,在本项目中我们用两种API结合的方式。在一些需要对详细信息进行控制的地方我们使用了低级API,比如在顶部的logo。而在一些需要高级API性能的地方,我们用到了高级API组件,如程序中的输入框。通过使用高级API,极大的简化了程序的代码,提高了程序的性能;而通过使用低级API接口,实现了高级API所不能实现的动画等美观的界面。程序的界面截图如下所示: 图3-3 部分界面截图3.2.2 控制器模块控制器模块包括两部分,一个是控制界面切换以及数据更新的部分,用一个UIController来实现;另外一部分负责播放引擎的操作,由三个类来实现,PlayerController、PlayerMakerThread和PlayerRunnerThread,其中PlayerController负责两个播放器的调度(播放引擎采用两个播放器轮流播放的方式,这个内容在下面播放引擎模块里面有介绍)。PlayerMakerThread负责下载流媒体并将播放器准备就绪后加入到队列,PlayerRunnerThread负责播放队列最前面的一个播放器。UIController切换界面可以如下图所示,用户操作当前界面,然后触发事件,事件传给Controller,Controller去Model里面请求数据,获得Model数据后,Controller进行视图的选择,然后准备视图,视图自身实现paint方法,然后显示给用户,最后视图如果有数据更新,会更新到模型里面。 图3-4 MVC组件之间的调用通信图3.2.3 模型模块在整个项目中,模型起到了一个数据池的作用。软件中用到的所有数据都是存储在了模型中,当数据发生了更新的时候也是最先更新模型中的数据,然后其它用到数据的部分再从模型中取得相关的数据。系统启动的时候先从RMS中读取用户上次登录保存的数据信息,包括用户信息,用户设置的节目收藏,以及其它的节目列表之类的信息。在读取到这些信息之后,系统开始从网络读取相关数据,然后由控制器更新模型,再根据模型数据的更新,来刷新用户视图。比如用户的preset列表删除操作:if(controller_.delMyPresetStation(selectedStationIdx_)controller_.setModelListener(this);controller_.updateMyPresetModel();controller_.selectStation(-delStationIndex);updateUI();在用户选择了删除选中节目的时候,我们看系统是怎么做的。首先调用删除节目函数,返回true删除成功,继续执行if下面的语句。如果返回false则不执行。删除成功后第一步是绑定监听,将当前界面实现的监听绑定到model上面,然后更新模型中的preset列表,这时模型中的数据已经得到了更新,然后模型修改当前选中的节目index,因为先前选中的节目以及被我们删掉,因此跳到前一个,然后更新UI,这个时候在进行界面重绘的时候,会从模型中读取数据,然后重绘界面,这样就实现了界面的更新。3.2.4 播放引擎模块作为一个手机多媒体应用软件,播放器的设计是最重要的部分。由于目前GPRS网络带宽的限制,因此本项目暂时不考虑视频的播放,只设计了音频播放器。由于J2ME已经提供了对音频播放的API,所以单纯地实现声音播放是比较容易的。但如果要想做到边下载边播放,就需要自行设计流程。系统最终采用的方案是采用两个播放器交替播放。首先把第一段音频装载到第一个播放器中,然后开始播放。在开始播放后,同时把第二段音频装入第二个播放器,让第二个播放器处于就绪状态。当第一个播放器播放完毕时,立即启动第二个播放器,同时第一个播放器开始装入第三段音频。就这样,两个播放器交替准备,播放。这种方案的实际使用效果还可以,在两段音频切换之前基本顺畅,仅有很小的停顿感,能够满足系统的要求。3.2.5 网络通信模块网络通信模块主要实现了从服务器取数据,并解析后返回给模型,和将模型中的交互信息反馈给服务器的作用。网络通信模块第四章有详细介绍,这里暂时略过。3.2.6 RMS数据存储模块RMS(Record Management System) 是一个简单的面向记录(Record) 的数据库,也称为记录存储(Record Store)。在J2ME中,RMS 作为唯一的永久性存储工具,可以把它看作是由许多记录组合而成的一个个数据库表文件,这些记录将持久地保存和支持跨多个MIDlet 的请求。MIDlet 的记录存储由平台负责维护,也由平台决定生成的位置,但决定记录存储命名空间的是MIDlet 套件(即打包在一起的一个或多个MIDlet)。RMS 记录存储中的每一条记录都包括两列:一列用于存储惟一的记录标识,另外一列存储代表记录中数据的一组字节。下图展示了一个简单的记录存储数据库。表3-1记录ID数据1Byte数组2Byte数组惟一记录ID是一个整型值,用作记录的主关键字。第一条记录ID为1 ,然后是2,以此类推。一条记录被删除之后,它的记录ID 不会被重用。也就是说,如果表中有三条记录, ID 分别是1 ,2 和3 ,删除ID 2 ,将把这个标识永久性地从记录存储中删除。如果我们向这个表中添加另外一条记录,那么该行的标识将会是4。并且所添加的每个记录的长度不一定相同。记录存储是用名称来标识的。记录存储的名称最多可以包含32个字符,并且所有字符都是大小写敏感的。同一个MIDlet套件中不会包含两个名称相同的记录存储。每个记录存储都有一个版本号和一个日期/时间戳。在添加、替换或删除一个记录时,这两个值都会被更新。javax.microedition.rms程序包中包括了用来持久存储和访问数据的机制, 该包中提供了支持J2ME RMS 应用的java 类。在MIDP2. 0 中为四个接口RecordComparator、RecordEnumeration、RecordListener、RecordFilter 和一个类RecordStore。记录存储的操作和事件:记录存储等同于数据库系统中的表(table),是一个包含了一系列记录的文件,在RMS中,使用RecordStore类来表示记录存储。调用RecordStore类中的方法就可以完成记录存储的基本操作,包括:创建、打开、关闭、删除一个记录存储等。应用程序也可为记录存储对象设置监听器,监视记录的操作,捕捉记录的添加、删除、和修改等事件。要使用事件, 首先必须要实现RecordListener 接口。当一个记录存储中记录发生变化时,RecordListener 就会触发执行,功能类似于普通数据库中的触发器。记录存储中记录的操作:单一记录的操作主要包括:在一个打开的记录存储中添加、删除、检索和修改记录。这些操作可由RMS 中的API 完成,即调用RecordStore 类中的方法。而涉及多条记录的操作,如记录存储中记录的遍历、排序和查找,就要使用枚举器、比较器和过滤器。构建枚举器、比较器和过滤器对象需要实现RMS 类包中的其它三个接口,分别为枚举器接口RecordEnumeration、比较器接口RecordComparator 和过滤器接口RecordFilter。下面以项目中存储lastStation函数为例分析如何进行RMS操作,storeLastStation函数代码如下:public void storeLastStation(String recordStoreName,StationInfo lastStationInfo) byte rec; ByteArrayOutputStream os; DataOutputStream dos; RecordStore rs; try rs = RecordStore.openRecordStore(recordStoreName, true); try os = new ByteArrayOutputStream(); dos = new DataOutputStream(os); System.out.println(lastStationI); dos.writeUTF(lastStationI); dos.writeUTF(lastStationInfo.country); dos.writeUTF(lastStationInfo.language); dos.writeUTF(lastStationInfo.format); dos.writeUTF(lastStationInfo.bitrate); dos.writeUTF(lastStationInfo.location); dos.writeUTF(lastStationInfo.type); dos.writeUTF(lastStationInfo.homepage); dos.writeUTF(lastStationInfo.url); dos.writeUTF(lastStationInfo.stationid); rec = os.toByteArray(); /如果记录不存在,则新增,否则对记录进行修改 if (rs.getNumRecords() = 0) rs.addRecord(rec, 0, rec.length); else rs.setRecord(1, rec, 0, rec.length); os.close(); dos.close(); catch (IOException ex) rs.closeRecordStore(); catch (RecordStoreFullException fullStore) System.out.println(RecordStoreFullException); catch (RecordStoreNotFoundException notFoundException) System.out.println(RecordStoreNotFoundException); catch (RecordStoreException recordStoreException) System.out.println(RecordStoreException); catch (java.lang.NullPointerException npe) System.out.println(RecordStore save ok!); 程序先用字节输出流和数据输出流对数据进行封装,然后os.toByteArray()将数据转换成字符数组openRecordStore方法的第一个参数表示记录表的名字,第二个参数true表示没有记录则创建一个新的记录,如果是false则不会创建而是报错,提示Nullpointer异常。初始化记录表后,判断是否已经存在记录,如果不存在则添加rs.addRecord(rec, 0, rec.length)。如果存在则替换掉原来的记录rs.setRecord(1, rec, 0, rec.length)。第四章 网络通信模块的详细设计4.1 网络通信模块的总体设计网络模块实现了客户端从服务器端获取数据和更新数据的功能,模块之间是调用与被调用的关系。软件与服务器端是C/S架构,服务器端提供了Web Service服务,客户端的调用使用了SOAP协议。对其中传输的节目数据和用户信息进行了加密处理,以防止被中途拦截。网络通信模块各层之间的关系如下图所示:AES加密/MD5解密界面框架模块Web ServiceSOAPXML解析AES解密/MD5加密服务器图4-1 MVC网络模块结构图4.2 HTTP协议连接HTTP的工作过程为典型的客户/服务器工作模式,在本项目中客户端就是我们的播放器,服务器即是Web Service服务器。HTTP 的工作过程使用请求/响应握手方式:客户端发生连接,双方建立起一个TCP 连接;客户端发出请求;服务器处理请求,返回应答;服务器关闭连接。为在客户端与服务器之间交换信息,完成传输过程,HTTP 定义了一套完整的消息结构。消息分两类:客户方发出的请求消息;服务器发出的应答消息,这两者都依据制定传输类体(亦即消息载体)的RFC822 规范中规定的通用消息格式具体实施。通用格式如下(其中“;”表示注释,“*”表示可出现若干次,“?”表示或者):generic-message= start-line ; Start-Line= Request-Line ? Status- Line* message- header ;CRL F ; CRL F 表示回车换行message-body 解释:消息首部(message- header) 域名与域值以冒号“:”隔开;message-header= field- name: field- value 消息首部域的内容主要为关于消息的消息(metamessage),如消息体数据的类型、长度、有效日期等。在我们的服务器端接口中给出了如下的定义:Content-Type: text/xml; charset=utf-8Content-Length: lengthContent-Type: text/xml; charset=utf-8; 表示可接受文本文件中的xml类型文件,字符集为utf-8字符集。Content-Length: length; 表示消息体的数据长度为length字节这些信息对于接收方的处理来说是很重要的。(1) 客户的请求消息(HTTP Request Headers Information)请求消息由几行A SC II 文本构成, 格式为:Request- Line* (general- header? request- header? entity- header)CRLFmessage- body 解释:Request- line= Method SP Request- URISP HTTP- Version CRL F; SP 指空格Method=“OPTIONS ?GET ? HEAD ? PU T ? DEL ETE ? TRACE? Extension- methodRequest- URI=“3 ? absolute URI? abs path请求行中的方法指定了服务器对Request- URI指定的资源进行的动作。最常用的方法为GET、HEAD 和POST。GET , 该方法的目的是取回由请求URI指定的资源对象。对象的类型不同, 取回的结果也不同: 1) 对象为文件, 则取回文件内容, 这是最常用的情况; 2) 对象为程序(如CG I 程序) 或描述, 则取回的是该程序执行的结果, 或该描述的输出; 3) 对象为数据库查询, 则取回此次查询结果。一般情况下, 将HTML 网页的输入表中内容递交给服务器的CGI程序处理, 通常用GET。HEAD, 要求服务器查找有关某个资源对象的信息, 如对象的大小, 最后一次修改时间等。这些信息对于接收方的处理来说是很重要的。HEAD不要求取回对象本身。POST, 主要用于发送客户端的内容, 同时指定服务器中处理该内容的方法。(2)WEB服务器应答消息(HTTP Response Headers Information)应答消息格式为:Status- Line* (general- header? response- header? entity- header)CRLFmessage-body解释:Status- Line= HTTP- Version SP Status- Code SP Reason- Phrase CRLF其中状态码Status-Code 为一个三位数字的数值, 表示服务方对客户请求进行处理所得的结果状态, 如“200”表示请求被服务方成功处理: 原因短语Reason- Phrase 对这个状态码进行了更详细的描述。lxx (x 指0 到f 的十六进制数) 为报告型 状态码, 表明请求被接收, 正在进行处理; 2xx 为成功状态码, 表示请求被成功接收和处理; 3xx 为重定向状态码, 通知客户机如要完成请求, 需进行下一步的处理动作; 4xx 为客户机 错误状态码, 表示请求有语法错误或不能被执行; 5xx 为服务器错误状态码, 表明服务器发生错误, 不能完成一个显然有效的请求。(3) 一个HTTP 连接的完全过程下面以login操作为例,分析客户端如何连接服务器的全过程:第一步: 客户机向WEB 服务器发出连接请求,WEB 服务器响应, 客户机和WEB 服务器之间建立一条TCP连接。此时,WEB服务器会创建一系列环境变量并给它们赋值, 这些变量保存客户端的IP 地址、WEB服务器名称等这样一些信息, 但每个SOAP操作会有不同的Action。初始化连接代码:httpConn_ = (HttpConnection)Connector.open(wsurl);httpConn_.setRequestMethod(HttpConnection.POST);httpConn_.setRequestProperty(Content-Type,text/xml;charset=utf-8);httpConn_.setRequestProperty(SOAPAction,ws.StreamP/Login);第二步: 客户机发出HTTP Request Headers Information,与服务器端进行连接,发送消息。代码如下: outputStream_ = httpConn_.openOutputStr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论