基于J2ME的手机流媒体音频播放器开发 ——网络通信模块设计与实现_第1页
基于J2ME的手机流媒体音频播放器开发 ——网络通信模块设计与实现_第2页
基于J2ME的手机流媒体音频播放器开发 ——网络通信模块设计与实现_第3页
基于J2ME的手机流媒体音频播放器开发 ——网络通信模块设计与实现_第4页
基于J2ME的手机流媒体音频播放器开发 ——网络通信模块设计与实现_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于J2ME的 流媒体音频播放器开发网络通信模块设计与实现摘 要 移动技术正在改变我们的生活和工作方式。它们是塑造未来经济和社会的真正革命性力量。随着智能可编程设备和高速无线网络的日益普及,它们为软件开发人员创造了巨大的时机。本文简单阐述了一个基于J2ME的 流媒体音频播放器的开发。该播放器通过Web Service提供的效劳实现流媒体URL的获取并播放以及用户与效劳器的互动操作,用户可以用 参与节目的投票、推荐给自己的好友等。本文分为六局部:第一局部分析了 流媒体的应用前景并对文章结构进行了简单的介绍。第二局部介绍了系统的开发平台和系统用到的相关技术。第三局部介绍了播放器的设计,包括系统的总

2、体设计目标,系统流程,系统的结构框架,系统的硬件平台;最后还对系统的各个模块进行了简单的介绍分析。第四局部详细介绍了网络通信模块。第五局部介绍了系统测试及结果,包括单元测试,集成测试和系统测试。第六局部对全文的内容进行了总结。关键字 流媒体音频 J2ME SOAP KXMLJ2ME-based mobile phone streaming audio player developmentDesign and Implementation of Network communication moduleAbstract: Mobile technology is changing our way

3、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-ba

4、sed 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 s

5、o 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

6、 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, inc

7、luding 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目 录 TOC o 1-2 h z u HYPERLINK l _Toc200025231 第一章 绪论 PAGEREF _Toc200025231 h 1 HYPERLINK l _Toc200025232 应用前景分析 PAGEREF _Toc200025232 h 1 HYP

8、ERLINK l _Toc200025233 本文的主要内容及组织 PAGEREF _Toc200025233 h 1 HYPERLINK l _Toc200025234 第二章 开发平台及相关技术 PAGEREF _Toc200025234 h 2 HYPERLINK l _Toc200025235 系统的开发环境平台 PAGEREF _Toc200025235 h 2 HYPERLINK l _Toc200025236 系统的相关技术介绍 PAGEREF _Toc200025236 h 4 HYPERLINK l _Toc200025237 第三章 播放器的总体设计 PAGEREF _To

9、c200025237 h 8 HYPERLINK l _Toc200025238 系统总体设计 PAGEREF _Toc200025238 h 8 HYPERLINK l _Toc200025239 系统模块设计 PAGEREF _Toc200025239 h 11 HYPERLINK l _Toc200025240 第四章 网络通信模块的详细设计 PAGEREF _Toc200025240 h 19 HYPERLINK l _Toc200025241 4.1 网络通信模块的总体设计 PAGEREF _Toc200025241 h 19 HYPERLINK l _Toc200025242 4.

10、2 协议连接 PAGEREF _Toc200025242 h 20 HYPERLINK l _Toc200025243 4.3 SOAP访问 PAGEREF _Toc200025243 h 23 HYPERLINK l _Toc200025244 4.4 J2ME中XML的解析 PAGEREF _Toc200025244 h 25 HYPERLINK l _Toc200025245 第五章 测试及结果 PAGEREF _Toc200025245 h 29 HYPERLINK l _Toc200025246 5.1 单元测试 PAGEREF _Toc200025246 h 29 HYPERLIN

11、K l _Toc200025247 5.2 集成测试 PAGEREF _Toc200025247 h 30 HYPERLINK l _Toc200025248 5.3 系统测试 PAGEREF _Toc200025248 h 31 HYPERLINK l _Toc200025249 第六章 总结 PAGEREF _Toc200025249 h 34 HYPERLINK l _Toc200025250 致谢语 PAGEREF _Toc200025250 h 35 HYPERLINK l _Toc200025251 参考文献 PAGEREF _Toc200025251 h 36第一章 绪论应用前景

12、分析 流媒体节目的推出是 多媒体时代的重要标志,将使得 成为继收音机、网络之后的第三种语音载体播送工具。上班族可以在上下班的途中收听新闻;在校学生可在晨练时收听英语播送练习听力、口语;商务人士可以在候机厅、火车上收听最新的股市行情;球迷朋友可以在第一时间了解国内外体坛快讯,还可以发送自己喜爱的节目与朋友分享 流媒体节目在很大程度上满足了广阔消费者与日俱增的信息需求。目前,基于 终端的移动交互式正在成为移动运营商的香饽饽。无论是国内运营商还是海外的运营商争相推广此项新业务,并将其作为3G时代的重要业务加以开展与规划。这种移动交互式业务,最吸引人的地方,就在于将 用户与播送节目之间的互动变得更为直

13、接和丰富。例如,当节目正在播放时,用户的 上会显示收录该节目的名称、节目的描述信息等信息。用户可以用 参与投票、推荐给自己的好友等。这种交互方式让 流媒体变得更加贴近听众,而且为移动运营商创造更多的收入来源。本文的主要内容及组织本文分为六局部。第一局部介绍了 流媒体的现状并进行了简单的介绍。第二局部介绍了系统的开发平台和系统用到的相关技术。第三局部介绍了播放器的设计,包括系统的总体设计目标,系统流程系统的结构框架,系统的硬件平台最后还对系统的各个模块进行了简单的介绍分析。第四局部详细介绍了网络通信模块。第五局部介绍了系统测试及结果,包括单元测试,集成测试和系统测试。第六局部对全文的内容进行了总

14、结。第二章 开发平台及相关技术系统的开发环境平台 Eclipse平台简介Eclipse可以用来开发Java应用程序、Web应用程序,甚至是C+程序,因为Eclipse平台是一个开放的平台,可以通过加载插件实现功能的扩充。Eclipse的核心被设计为可以动态发现、装入和运行插件,平台中的每个子系统本身是有实现某些关键功能的一组插件构建的,安装不同的插件可以使得Eclipse具有不同的功能和开发能力。Eclipse平台小组JDTJava开发工具PED插件开发者环境工作台JfaceSWT工作空间平台运行时帮助图2-1 Eclipse开发包的结构Eclipse开发包的结构如上图所示。Eclipse开发

15、包中有两个主要的局部:Eclipse平台和插件工具。插件开发工具主要有2个,其中Java开发工具(JDT, Java Development Tooling)实现了功能完整的Java开发环境;插件开发者环境PDE, Plug-in Developer Environment添加了专门的工具使插件和扩展的开发能够顺利进行。在Eclipse平台中,平台运行时Platform Runtime通过OSGi框架实现,关于OSGi的详细信息可以访问 HYPERLINK 获得。平台运行时定义了平台的扩展点和插件模型,使得开发人员能够进行Eclipse插件开发。开发出来的插件由平台运行时根据平台注册表中的信息

16、动态地发现和加载。工作空间(Workspace)可以进行资源管理,例如管理工程、文件和文件夹等资源。工作站(Workbench)提供了定义用于添加用户界面组件例如,试图或菜单操作的扩展点。帮助Help定义了帮助文档的扩展点,插件的帮助文档或者其他文档都可以集中在帮助系统中。小组Team定义了用于管理资源和设置资源版本的小组编程模型。2. CLDC 和 MIDP平台CLDC1.0JSR 30标准在1999年秋到2000年春完成并发布,共有18个知名厂商成员参与了标准的制定。业界知名公司的鼎力支持确保了CLDC可以为开发者提供一个标准化、需要最小足迹footprint、针对资源受限设备的应用程序开

17、发平台。CLDC的推出使得第三方开发者为移动终端设备开发应用程序,以及动态下载应用和内容到移动终端成为可能。这也是制定CLDC的一个重要目标。MIDPMobile Information Device Profile,移动信息设备简表是为移动 和入门级PDA设计的。它为移动应用程序提供了所需的全部核心功能,包括应用程序模型、用户界面、持久性数据存储、联网能力通用连接框架定义在CLDC中,在MIDP中实现及应用程序管理。目前应用非常广泛的MIDlet就是在MIDP中定义的。CLDC和MIDP组成的完备Java运行环境提升了手持设备的能力,并且最小化了设备内存和电源的能耗。 Nokia开发者平台S

18、eries60介绍Series 60 Platform向消费用户提供了最上乘的智能 体验。在范围广泛的终端设备上实现的Series 60 Platform向应用及媒体开发伙伴们提供了统一完整的技术组合。它在提供各种高级企业应用、游戏,及音乐方面驾轻就熟,同样,它也向为开发伙伴们提供了移动领域中无与伦比的众多时机。应用开发伙伴们可以用C+ 使用各种本地Symbian OS API、Java 语言使用具有大量附加Java 标准请求JSR的移动信息设备描述MIDP1.0 或MIDP 2.0,或Python进行开发。所有这些都得到了开放移动联盟OMA数字版权管理DRM的支持,以保护开发伙伴的知识产权。

19、到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中集合了多种特性和功能,令开发伙伴们能进入众多新市场,让自己的应用软件能发

20、挥更佳性能,并提升应用软件的集成度。 CVS协作开发工具CVS (Concurrent Versions System)是基于TCP/IP协议的版本控制工具。CVS是一个并行版本控制系统,它采用C/S模式,它的复杂度和功能性属于中等,是当今最流行的版本控制系统。系统的相关技术介绍 J2ME技术简介J2ME即JAVA 2 Micro Edition,它是Java 2的组成局部,与J2SE、J2EE并称。J2ME是一种高度优化的Java运行环境,应用于大量的消费类电子设备,如Cellular Phones(蜂窝 )、Screen Phones(可视 )、Digital Set-top Boxes(

21、数字机顶盒)、Car Navigation Systems(汽车导向系统)等,同时也广泛被移动通信设备所采用,如移动 、双向寻呼机、智能卡、个人电脑记事本(Personal Organizer)和掌上电脑(Palmtop)等。J2ME技术将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。 SOAP技术简介SOAP定义了一种在 客户端和效劳器端传输命令和参数的机制。SOAP不关心什么操作系统、编程语言或在效劳器端或客户端使用的对象模型:除了需要使用 传输外,与其他无关。SOAP是简单的。客户端发送一个请求给效劳器,调用相应的对象,然后效劳器返回结果。这些消息

22、是XML格式的,并且封装成符合 协议的消息。SOAP通过已有的Internet下层结构来工作。你不需要作任何工作,它符合任何路由器、防火墙或代理效劳器。SOAP客户请求封装在一个 POST或M-POST包中。SOAP定义了两种类型的消息,请求和响应,从而允许客户端能够递交一个远端请求,允许效劳器端能够响应这些请求。SOAP不需要任何对象模型,也不需要通过其他的通讯实体来使用对象模型。在防止对象模型的根底上,SOAP将大局部对象功能(如初始化代码和垃圾堆积)留给客户端和效劳器端工作的底层,同时其他功能(如信号编辑)那么可以留给SOAP综合已有的应用程序和底层结构来完成。SOAP可以使用任何语言来

23、完成,只要客户端发送正确SOAP请求(也就是说,传递一个适宜的参数给一个实际的远端效劳器)。SOAP没有对象模型,应用程序可以捆绑在任何对象模型中。早期实现SOAP功能的有Java, Perl, 和Windows版本。当将每个功能变为SOAP实体能够理解的参数和响应后(例如,数据保存在一个XML元素中,并封装在 消息中),它就可以和其他的SOAP功能交互作用。 Web Service简介Web Service是为实现“基于web无缝集成的目标而提出的全新概念,希望通过Web Service能够实现不同的系统之间能够用“软件-软件对话的方式相互调用,打破软件应用、网站和各种设备之间格格不入的状态

24、。Web Service是一个应用程序,它向外界暴露一个能够通过Web进行调用的API,这就是说,能够用编程的方法通过web调用来实现某个功能的应用程序。Web Service是一种新的Web应用程序分支,它们是自包含、自描述,模块化的应用,可以在网络中被描述、发布、查找以及通过Web调用。Web Service平台需要一套协议来实现分布式应用程序的创立。任何平台都有它的数据表示方法和类型系统。要实现互操作性,Web Service平台必须提供一套标准的类型系统,用于沟通不同的平台、编程语言和组建模型中的不同类型系统。可扩展性标记语言XML是Web Service平台中表示数据的根本格式。除了

25、易于建立和易于分析外,XML主要的优点在于它基于平台无关,由于厂商无关。XML是由万维网协会W3C创立,W3C制定的XML SchemaXSD定义了一套标准的数据类型,并给出了一种语言来拓展这套数据类型。Web Service平台是用XSD来作为数据类型系统的。当用某种语言如VB.NET 或C#来构造一个Web Service时,为了符合Web Service标准,所有使用的数据类型都必须被转换为XSD类型。如想让他使用在不同的平台和不同的软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是上面谈到的SOAP协议。Web Service描述语言WSDL是用计算机能阅读的方式提供的一

26、个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。UDDI即统一描述、发现和集成Universal Description , Discovery , and Integration,其目的是为电子商务建立标准,UDDI是一套基于Web的、分布式、为Web Service提供的、信息注册中心的实现标准标准,同时也包含一组是企业能将自身提供的Web Service注册,可以使别的奇特能够发现访问间协议的实现标准。Web Service本身其实是在实现应用程序的通信。现在有两种应用程序通信的方法

27、:RPC远程过程调用和信息传递。使用RPC的时候,客户端的概念是调用效劳器上的远程过程,通常的方式为实例化一个远程对象并调用其方法和属性。RPC系统试图到达一种位置上的透明性:效劳器暴露出远程对象的端口,而客户端就好似在本地使用这些对象的接口一样,这样就隐藏的底层的信息,客户端也就根本不需要知道对象是在哪台机器上。第三章 播放器的总体设计系统总体设计 总体目标本工程设计的是一款能在 上收听全球流媒体音频节目的播放器。该系统基于J2ME平台,通过移动网络与Web Service效劳器和音频节目效劳器进行交互,集成了节目列表浏览、节目点评推荐和流媒体播放功能。本软件在开发实现过程中采用模块化、结构

28、化的软件设计思想,采用MVC模式来组织系统总体框架,提高了系统的可移植性和可维护性。利用MMAPI实现对 协议传输的MP3格式音频流的解码,使用多线程技术,实现在播放缓冲区中音频数据的同时,不断地从效劳器下载后续音频数据到客户端缓冲区,即“边下载,边播放,给用户带来“实时播放的业务感知体验。系统实现了以下目标:1.实现 上对 流式传输的MP3格式流媒体音频的解析和流畅播放。2.可以通过Web Service实现 网络流媒体节目播放软件与门户系统的互动和信息传递。3.可以收听全球网络的流媒体节目,按国家、语言、格式对节目进行分类和搜索。4.实现节目收听排行榜和用户收听偏好设置。5.实现跨机型、跨

29、品牌的通用性(主要面向中、高端的智能 )。6.实现系统代码的可维护性和可移植性。7.美观、时尚、易用、人性化的用户界面。系统流程图图3-1 系统流程图3.1.3 MVC结构框架本系统的整体遵循了模型-视图-控制器(MVC)模式,MVC模式是“Mode-view-Controller的缩写,MVC应用程序总是由这三个局部组成。视图即view)代表用户交互界面,模型(Model)就是业务流程状态的处理以及业务规那么的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。控制(Controller)可以理解为从用户接收

30、请求,将模型与视图匹配在一起,共同完成用户的请求。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Model的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。模型、视图与控制器的别离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、

31、视图、控制器三者之间的关系和各自的主要功能,如图3-2所示。视图选择用户请求状态改变通知改变状态查询模型(Model)封装应用程序状态相应状态查询应用程序功能通知视图改变视图(View)解释模型模型更新请求发送用户输入给控制器允许控制器选择视图控制器(Controller)定义应用程序行为用户动作映射成模型更新选择相应的视图方法调用事件图3-2 MVC组件类型的关系和功能 系统运行平台为了能够运行这一软件, 设备需要满足一定的软硬件配置。如下:(1)(2)(3)MMAPI 1.1(MP3 Support),JSR 135(4)Memory heap size800 KB(5)Protocols

32、: 、socket(6)MIME Types: audio/mp3、audio/wav(7)GPRS当前的中、高端 设备均已到达或超过以上所列配置标准。系统模块设计 UI界面模块J2ME中的LCDUI提供了高级界面API和低级界面API以满足不同开发人员的需要。高级API很容易学习和使用。它的目标是支持快速开发周期,并且使用高级API更容易编写可移植的代码。而低级API为开发人员提供原始的能力和弹性,这些开发人员需要控制用户体验的每一个方面。高级API的设计目标是支持跨设备的可移植应用程序。他在高度抽象水平上提供了一套标准的UI类,这些代表根本的UI组件。设备实现了这些组件,因此使用高级API

33、编程的应用程序采用该设备的本地化界面。例如S60和S40设备通常根据它们自己的UI原那么,不一样的实现同样的窗口小部件。但是,高级UI方法的缺点也很明显:开发人员对显示的详细信息几乎没有控制,并且不能超出预定义的窗口小部件组件集合的范围。例如,很难仅仅使用高级API开发动画屏幕。低级API是开发人员可以完全控制整个设备的现实,包括在任何一个像素上的绘制,产生根本的形状以及使用特殊的字体显示文本。低级API还支持比高级API更丰富的用户交互,高级API只捕获软键事件。低级API为开发人员提供机制,以处理所有键盘的按键事件和指针移到。自定义显示和事件处理对游戏开发人员开发至关重要。低级UI应用程序

34、需要显示它自己,而不是将任务委派给程序运行库。因此,低级API应用程序通常要求比高级API应用程序拥有更多的代码。将UI应用程序移植到不同的设备有时是一件单调乏味的任务。例如,很难使用像素级工具实现一个具有本地观感的文本输入框。另外,使用低级API实现的文本输入框可能没有即用型高级API组件一样的性能。综合以上高级API和低级API的各自特点的考虑,在本工程中我们用两种API结合的方式。在一些需要对详细信息进行控制的地方我们使用了低级API,比方在顶部的logo。而在一些需要高级API性能的地方,我们用到了高级API组件,如程序中的输入框。通过使用高级API,极大的简化了程序的代码,提高了程序

35、的性能;而通过使用低级API接口,实现了高级API所不能实现的动画等美观的界面。程序的界面截图如下所示: 图3-3 局部界面截图 控制器模块控制器模块包括两局部,一个是控制界面切换以及数据更新的局部,用一个UIController来实现;另外一局部负责播放引擎的操作,由三个类来实现,PlayerController、PlayerMakerThread和PlayerRunnerThread,其中PlayerController负责两个播放器的调度(播放引擎采用两个播放器轮流播放的方式,这个内容在下面播放引擎模块里面有介绍)。PlayerMakerThread负责下载流媒体并将播放器准备就绪后参加

36、到队列,PlayerRunnerThread负责播放队列最前面的一个播放器。UIController切换界面可以如下列图所示,用户操作当前界面,然后触发事件,事件传给Controller,Controller去Model里面请求数据,获得Model数据后,Controller进行视图的选择,然后准备视图,视图自身实现paint方法,然后显示给用户,最后视图如果有数据更新,会更新到模型里面。 图3-4 MVC组件之间的调用通信图 模型模块在整个工程中,模型起到了一个数据池的作用。软件中用到的所有数据都是存储在了模型中,当数据发生了更新的时候也是最先更新模型中的数据,然后其它用到数据的局部再从模型

37、中取得相关的数据。系统启动的时候先从RMS中读取用户上次登录保存的数据信息,包括用户信息,用户设置的节目收藏,以及其它的节目列表之类的信息。在读取到这些信息之后,系统开始从网络读取相关数据,然后由控制器更新模型,再根据模型数据的更新,来刷新用户视图。比方用户的preset列表删除操作:if(controller_.delMyPresetStation(selectedStationIdx_)controller_.setModelListener(this);controller_.updateMyPresetModel();controller_.selectStation(-delStat

38、ionIndex);updateUI();在用户选择了删除选中节目的时候,我们看系统是怎么做的。首先调用删除节目函数,返回true删除成功,继续执行if下面的语句。如果返回false那么不执行。删除成功后第一步是绑定监听,将当前界面实现的监听绑定到model上面,然后更新模型中的preset列表,这时模型中的数据已经得到了更新,然后模型修改当前选中的节目index,因为先前选中的节目以及被我们删掉,因此跳到前一个,然后更新UI,这个时候在进行界面重绘的时候,会从模型中读取数据,然后重绘界面,这样就实现了界面的更新。 播放引擎模块作为一个 多媒体应用软件,播放器的设计是最重要的局部。由于目前GP

39、RS网络带宽的限制,因此本工程暂时不考虑视频的播放,只设计了音频播放器。由于J2ME已经提供了对音频播放的API,所以单纯地实现声音播放是比拟容易的。但如果要想做到边下载边播放,就需要自行设计流程。系统最终采用的方案是采用两个播放器交替播放。首先把第一段音频装载到第一个播放器中,然后开始播放。在开始播放后,同时把第二段音频装入第二个播放器,让第二个播放器处于就绪状态。当第一个播放器播放完毕时,立即启动第二个播放器,同时第一个播放器开始装入第三段音频。就这样,两个播放器交替准备,播放。这种方案的实际使用效果还可以,在两段音频切换之前根本顺畅,仅有很小的停顿感,能够满足系统的要求。3.2.5 网络

40、通信模块网络通信模块主要实现了从效劳器取数据,并解析后返回给模型,和将模型中的交互信息反应给效劳器的作用。网络通信模块第四章有详细介绍,这里暂时略过。 RMS数据存储模块RMS(Record Management System) 是一个简单的面向记录(Record) 的数据库,也称为记录存储(Record Store)。在J2ME中,RMS 作为唯一的永久性存储工具,可以把它看作是由许多记录组合而成的一个个数据库表文件,这些记录将持久地保存和支持跨多个MIDlet 的请求。MIDlet 的记录存储由平台负责维护,也由平台决定生成的位置,但决定记录存储命名空间的是MIDlet 套件(即打包在一起

41、的一个或多个MIDlet)。RMS 记录存储中的每一条记录都包括两列:一列用于存储惟一的记录标识,另外一列存储代表记录中数据的一组字节。下列图展示了一个简单的记录存储数据库。表3-1记录ID数据1Byte数组2Byte数组惟一记录ID是一个整型值,用作记录的主关键字。第一条记录ID为1 ,然后是2,以此类推。一条记录被删除之后,它的记录ID 不会被重用。也就是说,如果表中有三条记录, ID 分别是1 ,2 和3 ,删除ID 2 ,将把这个标识永久性地从记录存储中删除。如果我们向这个表中添加另外一条记录,那么该行的标识将会是4。并且所添加的每个记录的长度不一定相同。记录存储是用名称来标识的。记录

42、存储的名称最多可以包含32个字符,并且所有字符都是大小写敏感的。同一个MIDlet套件中不会包含两个名称相同的记录存储。每个记录存储都有一个版本号和一个日期/时间戳。在添加、替换或删除一个记录时,这两个值都会被更新。程序包中包括了用来持久存储和访问数据的机制, 该包中提供了支持J2ME RMS 应用的java 类。在MIDP2. 0 中为四个接口RecordComparator、RecordEnumeration、RecordListener、RecordFilter 和一个类RecordStore。记录存储的操作和事件:记录存储等同于数据库系统中的表(table),是一个包含了一系列记录的文

43、件,在RMS中,使用RecordStore类来表示记录存储。调用RecordStore类中的方法就可以完成记录存储的根本操作,包括:创立、翻开、关闭、删除一个记录存储等。应用程序也可为记录存储对象设置监听器,监视记录的操作,捕捉记录的添加、删除、和修改等事件。要使用事件, 首先必须要实现RecordListener 接口。当一个记录存储中记录发生变化时,RecordListener 就会触发执行,功能类似于普通数据库中的触发器。记录存储中记录的操作:单一记录的操作主要包括:在一个翻开的记录存储中添加、删除、检索和修改记录。这些操作可由RMS 中的API 完成,即调用RecordStore 类中

44、的方法。而涉及多条记录的操作,如记录存储中记录的遍历、排序和查找,就要使用枚举器、比拟器和过滤器。构建枚举器、比拟器和过滤器对象需要实现RMS 类包中的其它三个接口,分别为枚举器接口RecordEnumeration、比拟器接口RecordComparator 和过滤器接口RecordFilter。下面以工程中存储lastStation函数为例分析如何进行RMS操作,storeLastStation函数代码如下:public void storeLastStation(String recordStoreName,StationInfo lastStationInfo) byte rec; B

45、yteArrayOutputStream 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

46、.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(lastStat

47、ionInfo.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.pr

48、intln(RecordStoreFullException); catch (RecordStoreNotFoundException notFoundException) System.out.println(RecordStoreNotFoundException); catch (RecordStoreException recordStoreException) System.out.println(RecordStoreException); catchterException npe) System.out.println(RecordStore save ok!); 程序先用字

49、节输出流和数据输出流对数据进行封装,然后os.toByteArray()将数据转换成字符数组openRecordStore方法的第一个参数表示记录表的名字,第二个参数true表示没有记录那么创立一个新的记录,如果是false那么不会创立而是报错,提示Nullpointer异常。初始化记录表后,判断是否已经存在记录,如果不存在那么添加rs.addRecord(rec, 0, rec.length)。如果存在那么替换掉原来的记录rs.setRecord(1, rec, 0, rec.length)。第四章 网络通信模块的详细设计4.1 网络通信模块的总体设计网络模块实现了客户端从效劳器端获取数据和

50、更新数据的功能,模块之间是调用与被调用的关系。软件与效劳器端是C/S架构,效劳器端提供了Web Service效劳,客户端的调用使用了SOAP协议。对其中传输的节目数据和用户信息进行了加密处理,以防止被中途拦截。网络通信模块各层之间的关系如下列图所示:AES加密/MD5解密界面框架模块Web ServiceSOAPXML解析AES解密/MD5加密效劳器图4-1 MVC网络模块结构图4.2 协议连接 的工作过程为典型的客户/效劳器工作模式,在本工程中客户端就是我们的播放器,效劳器即是Web Service效劳器。 的工作过程使用请求/响应握手方式:客户端发生连接,双方建立起一个TCP 连接;客户

51、端发出请求;效劳器处理请求,返回应答;效劳器关闭连接。为在客户端与效劳器之间交换信息,完成传输过程, 定义了一套完整的消息结构。消息分两类:客户方发出的请求消息;效劳器发出的应答消息,这两者都依据制定传输类体(亦即消息载体)的RFC822 标准中规定的通用消息格式具体实施。通用格式如下(其中“;表示注释,“*表示可出现假设干次,“?表示或者):generic-message= start-line ; Start-Line= Request-Line ? Status- Line* message- header ;CRL F ; CRL F 表示回车换行message-body 解释:消息首

52、部(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; 表

53、示消息体的数据长度为length字节这些信息对于接收方的处理来说是很重要的。(1) 客户的请求消息( Request Headers Information)请求消息由几行A SC II 文本构成, 格式为:Request- Line* (general- header? request- header? entity- header)CRLFmessage- body 解释:Request- line= Method SP Request- URISP - Version CRL F; SP 指空格Method=“OPTIONS ?GET ? HEAD ? PU T ? DEL ETE ?

54、TRACE? Extension- methodRequest- URI=“3 ? absolute URI? abs path请求行中的方法指定了效劳器对Request- URI指定的资源进行的动作。最常用的方法为GET、HEAD 和POST。GET , 该方法的目的是取回由请求URI指定的资源对象。对象的类型不同, 取回的结果也不同: 1) 对象为文件, 那么取回文件内容, 这是最常用的情况; 2) 对象为程序(如CG I 程序) 或描述, 那么取回的是该程序执行的结果, 或该描述的输出; 3) 对象为数据库查询, 那么取回此次查询结果。一般情况下, 将HTML 网页的输入表中内容递交给效

55、劳器的CGI程序处理, 通常用GET。HEAD, 要求效劳器查找有关某个资源对象的信息, 如对象的大小, 最后一次修改时间等。这些信息对于接收方的处理来说是很重要的。HEAD不要求取回对象本身。POST, 主要用于发送客户端的内容, 同时指定效劳器中处理该内容的方法。(2)WEB效劳器应答消息( Response Headers Information)应答消息格式为:Status- Line* (general- header? response- header? entity- header)CRLFmessage-body解释:Status- Line= - Version SP Sta

56、tus- Code SP Reason- Phrase CRLF其中状态码Status-Code 为一个三位数字的数值, 表示效劳方对客户请求进行处理所得的结果状态, 如“200表示请求被效劳方成功处理: 原因短语Reason- Phrase 对这个状态码进行了更详细的描述。lxx (x 指0 到f 的十六进制数) 为报告型 状态码, 说明请求被接收, 正在进行处理; 2xx 为成功状态码, 表示请求被成功接收和处理; 3xx 为重定向状态码, 通知客户机如要完成请求, 需进行下一步的处理动作; 4xx 为客户机 错误状态码, 表示请求有语法错误或不能被执行; 5xx 为效劳器错误状态码, 说

57、明效劳器发生错误, 不能完成一个显然有效的请求。(3) 一个 连接的完全过程下面以login操作为例,分析客户端如何连接效劳器的全过程:第一步: 客户机向WEB 效劳器发出连接请求,WEB 效劳器响应, 客户机和WEB 效劳器之间建立一条TCP连接。此时,WEB效劳器会创立一系列环境变量并给它们赋值, 这些变量保存客户端的IP 地址、WEB效劳器名称等这样一些信息, 但每个SOAP操作会有不同的Action。初始化连接代码: Conn_ = ( Connection)Connector.open(wsurl); Conn_.setRequestMethod( Connection.POST);

58、 Conn_.setRequestProperty(Content-Type,text/xml;charset=utf-8); Conn_.setRequestProperty(SOAPAction, /Login);第二步: 客户机发出 Request Headers Information,与效劳器端进行连接,发送消息。代码如下: outputStream_ = Conn_.openOutputStream();OutputStreamWriter osw = new OutputStreamWriter( outputStream_, utf-8 );osw.write( loginSo

59、ap, 0, loginSoap.length() );osw.flush();osw.close();第三步:WEB效劳器应答 Response Headers Information,并返回相应的处理结果:responseCode_ = Conn_.getResponseCode();if (responseCode_ != Connection. _OK)System.out.println( response code: + responseCode_);return -9; inputStream_ = Conn_.openInputStream();int len = (int)

60、Conn_.getLength();if (len 0) retInt=Integer.parseInt(processLoginResponseXML(inputStream_);OutputStreamWriter osw = new OutputStreamWriter( outputStream_, utf-8 );osw.write( loginSoap, 0, loginSoap.length() );osw.flush();osw.close();第四步:关闭连接, 一个请求-响应过程结束。if( Conn_!=null) Conn_.close();if(outputStrea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论