基于J2ME的手机游戏的开发.doc_第1页
基于J2ME的手机游戏的开发.doc_第2页
基于J2ME的手机游戏的开发.doc_第3页
基于J2ME的手机游戏的开发.doc_第4页
基于J2ME的手机游戏的开发.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

目 录摘 要1第一章 绪论11.1 研究背景11.2 研究内容1第二章 J2ME及其体系结构概述32.1 J2ME简介32.2 J2ME 体系结构32.3 移动信息设备简表概述42.3.1 MIDP的目标硬件环境42.3.2 MIDP应用程序42.3.3 CLDC和MIDP库中的类42.4 J2ME API简介52.4.1 MIDP API概述52.4.2 MIDlet应用程序52.4.3 使用定时器62.4.4 永久性数据(RMS)72.4.5 存储集(Record Store)82.4.6 记录92.4.7 异常102.5 用户界面(LCDUI)102.5.1 UI基础102.5.2 高级UI112.5.3 低级UI11第三章 手机游戏开发过程133.1 贪吃蛇游戏的规则简介以及开发环境133.1.1 贪吃蛇游戏的规则简介133.1.2 开发环境133.2 详细设计133.2.1 代码设计14第四章 程序的调试与运行194.1游戏的调试194.2 游戏的运行环境20结束语21致 谢22参考文献22基于J2ME的手机游戏开发摘 要随着通信技术的发展和手机的普及,手机游戏的开发技术越来越为人们所关注。以J2ME为开发平台,利用Java提供强大工具,不但可以在手机上实现静态HTML技术所无法实现的计算处理、数据存储、与服务器的通信等功能,而且能够开发各种手机游戏。本文在介绍J2ME及其体系结构的基础上,以贪吃蛇游戏为实例,描述了借助J2ME的MIDlet类库开发手机游戏的过程。关键词:手机游戏; MIDP应用程序; 永久性数据第一章 绪论1.1 研究背景JAVA自从20世纪90年代早期诞生以来,以其强大的功能迅速为广大程序员们所接受。从2001年开始,日本的国内的移动电话开始搭载Java。使用本来就是一种程序语言的Java之后,就可以在移动电话上完成以往静态的HTML内容所无法达成的计算处理、数据存储、与服务器的通信等等。如果能利用Java上其他丰富功能,那么就可以实现更多的功能。随着手机游戏的发展,国内外各大开发商纷纷运用Java进行手机游戏开发。J2ME作为一种基于Java的便携设备开发平台,在各大手机开发公司得到了广泛应用。1.2 研究内容本课题拟研究基于J2ME的手机游戏开发技术以及其特点,具体研究内容如下:1、手机游戏开发以及J2ME的基本理论和J2ME类库的使用;2、J2ME体系结构的研究;3、MIDP移动信息设备简表的研究; (1)、MIDP的目标硬件环境;(2)、MIDP应用程序; (3)、CLDC和MIDP库中的类。4、J2ME API的研究; (1)MIDlet应用程序的研究; (2)MIDlet的类库研究; (3)各事件发生器的应用。5、开发工具的应用和开发环境的设置。其中MIDP移动信息设备简表的研究和J2ME API的研究为重点,本课题将通过一个具体的手机游戏的开发来研究以上内容。第二章 J2ME及其体系结构概述2.1 J2ME简介 现在JAVA-JAVA2 Platform大致可分为J2SE、J2EE、J2ME三类。J2SE为JAVA-JAVA2 Platform 的标准版,通常在PC上使用的JAVA。J2EE是在J2SE的API上,扩展了给企业使用EJB与Servlet等主要使用在服务器上的功能。而J2ME则是面向家电和通信工具等微小设备。J2ME的目标是微小设备,这类设备有许多种类,在这些设备的J2ME当中,定义了CDC(Connected Device Configuration),CLDC(Connected Limited Device Configuration)这两个Configuration。CDC是以能用在个人网关、下一代移动电话、PDA(个人数字助理)、家电设备、POS终端、车辆导航系统等上运行为前提设计出来的。CLDC,是以能使用在移动电话、PDA(个人数字助理)、家电设备、POS终端等上面为前提设计出来的。2.2 J2ME 体系结构配置和简表:配置定义了一个设计在一系列类似硬件上运行的Java平台的能力。J2me的目标是家电与嵌入式设备,这类设备有很多种类,对应这些设备的J2me当中,定义了CDC(连接设备配置)和CLDC(受限接设备配置)两个配置,配置所提供的类函数只有Java.lang, Java.io,Java.util包等J2SE等核心类的子集。CLDC是与手机相关的,它实际是定义一个设备制造商用来实现Java运行环境的标准,第三方开发者只需要遵循这个标准。CLDC主要影响Java开发和软件发布的以下方面:1)目标设备的特性;2)安全模型:安全模型有两个部分,虚拟机和应用程序安全。虚拟机安全层的目的是保护下面的设备不受任何执行代码可能引起的损害。2.3 移动信息设备简表概述2.3.1 MIDP的目标硬件环境1)显示 :96*54象素,1位颜色,大约1:1比例;2)输入: (a)单手键盘或者小键盘;(b)双手的QWERTV键盘;(c)触摸屏。 3)内存: (a)128KB非易失性内存,供MIDP组件使用;(b)8KB的非易失性内存,供应用程序生成的永久数据使用;(c)32KB的易失性内存,供Java堆使用。4)网络: (a)双响无线网络,可间歇性连接;(b)通常是很有限的带宽。2.3.2 MIDP应用程序在MIDP上运行的Java程序被称为MIDlet。MIDlet是服从一些关于它运行环境和程序打包的一些规则。其运行环境是启动MIDlet,这是设备内置应用管理器的任务。应用程序能访问到下面的一些资源:(1)震动文件中的所有文件。(2)MIDlet描叙文件的内容(JAD)。2.3.3 CLDC和MIDP库中的类打包:MIDlet应用一般采用震动文件的形式。这个文件应该包含运行应用程序需要的类和所有的资源文件,它也应该包含一个叫manifest.mf的清单文件。保存在震动文件中的清单文件是一个简单的文本文件,包含属性值。应用程序描叙(JADs)在移动电话网络上传送大量的数据,需要有一个描叙文件让用户在没有下载整个包之前来查看一下MIDlet震动的细节。2.4 J2ME API简介2.4.1 MIDP API概述MIDP API包含以下五个部分,如表2-1所示:表2-1 MIDP API类 别描 述Application包括MIDlet类。Timers主要包括Timers和Timers Task类。Networking提供访问设备通信能力的接口。Persistence通过记录管理系统(RMS)API访问用户永久存储。User Interface包括MIDP LCDUI(液晶显示器用户界面)类。2.4.2 MIDlet应用程序MIDlet即MIDP的应用程序, MIDlet应用程序的核心是MIDlet类。为了创建一个MIDlet,必须从这个虚基类派生出自己的类。表2-2提供了从MIDlet类继承的方法。表2-2 MIDlet类方 法描 述访问JAR和JAD文件中的属性String gerAppProperty(string key)返回JAR和JAD中与key相对应的属性的值。Abstract void destoryApp (boolean unconditinal)应用程序管理器在应用程序关闭前,调用这个方法来给我们做一些事情的机会(例如保存状态和释放资源)。Abstract void pauseApp()在用户暂停游戏时,应用程序管理器调用MIDlet的类方法。Abstract void startApp()应用程序管理器调用MIDlet的这个方法,来告诉用户再次开启游戏。Abstract void notifyDestroyed()如果游戏者决定退出游戏,可以调用这个方法来通知应用程序管理器。续表2-2 MIDlet类方 法描 述Abstract void notifyPausrd()调用这个方法来通知应用程序管理器游戏者已经暂停游戏。Abstract void notifyRequest()调用这个方法来告诉应用程序管理器MIDlet要重新开始。应用程序管理器(Application Manager ,AM)的作用就是管理MIDlet 。本质上来说,MIDlet应用程序只存在两种状态暂停和运行。MIDlet被创建后默认为暂停状态,当应用程序管理器认为它准备完毕,它会调用startApp方法来通知MIDlet进入运行状态。2.4.3 使用定时器 MIDP API 包括两个关于定时器的类Java.util.Timer和Java.util.Timer Tast类 (如表2-3和2-4所示):表2-3 Java.util .Timer类 方 法 描 述Timer()构造一个新的Timer对象。Void cancel()停止Timer。Void schedule(TimeTask task,Dare d)把一个任务定时在时间d运行。Void schedule(TimeTask task, Data firstTime, long period )让一个任务第一次在一个指定的时间运行,然后每隔period毫秒运行一次。Void schedule(TimeTask task,long delay)指定一个任务在delay毫秒后运行一次。Void schedule(TimeTask task,long delay,long period)指定一个任务从delay毫秒连续运行,然后每隔period毫秒运行一次。Void scheduleAtFixedRate(timeTask task,Date firstTime,long period)指定一个任务从firstTime连续运行,然后以固定间隔period毫秒连续运行。Void scheduleAtFixedRate(TimeTask task,long delay,long period)指定一个任务在delay毫秒后运行,然后以固定间隔period毫秒连续运行。表2-4 Java.util.Timer Tast类方 法描 述Timer Task()构造一个新的Timer Task对象。Boolean cancel()结束该任务。Abstract void run()这个方法必须被一个包含Timer时间执行的代码的方法重载。Long scheduledExecution Time()返回任务上一次执行的确切时间。我们可以通过不同schedule的方法来确定什么时候执行任务,包括在一个指定的时间执行一次和那个时间后按照一个固定的时间间隔连续执行。也可以在一段延迟(单位是毫秒)后执行任务,还可以选择以固定的时间间隔连续执行。2.4.4 永久性数据(RMS)开发游戏时,保存数据在J2ME里是用RMS(Record Management System,记录管理系统)来实现的,可以在Javax.microedition.rms包中找到它,表2-7就是这个包中所有的类的列表。RMS采用记录的方式来保存数据,然后使用唯一的记录号来应用这些数据,成组的数据就被保存在存储集中。表2-7 RMS包(不包含异常)类描 述类RecordStore允许访问记录存储集功能。接口RecordComparator提供一个用来实现两个记录间比较的接口。RecordComparation提供记录存储集的枚举器;可以和比较器和过滤器联合使用。recordFilter对获取的数据进行过滤。RecordListener提供一个用来“监听”RMS中发生的事件的接口,比如记录增加,修改和删除。2.4.5 存储集(Record Store)记录存储集即一个记录存储的机制,表2-8中展示了完整的API。表2-8 记录存储API方 法描 述存储集访问方法Static RecordStore openRecordStroe(String record Name,blooean createIfNecessary)打开一个存储集或者在它不存在的时候创建一个存储集。Void closeRecordStore()关闭一个存储集。Static void deleteRecordStore(String recordStore Name)删除一个存储集。Long getLastModified()获取存储集最后被修改的时间。String getName()获取存储集的名称。int getNumrecords()返回存储集当前记录的数量。int getSize()返回存储集使用的总字节数。int getSizeAvailable()获取空闲空间。int getVersion()获取存储集的版本号。续表2-8 记录存储APIStatic String listRecordStores()获取MID中你可以访问的所有的记录存储集的字符串数组。记录访问方法int addRecord(byte,int offset,int numBytes) 向存储集中加入一条新的记录。byte getRecord(int recordId)用ID来获取一条记录。int getRecord(int recorded,byte buffer,int offset)把一条记录读取到buffer中。Void deletRecord(int recorded)删除与recordId相关的记录。Void setRecord(int recorded,byte newData,int offset,intnumBytes)使用新的字节数组与recordId相关联的内容。Int getNextRecordID()在插入后获取下一个记录的ID。Int getRecord(int recorded)返回按字节计算的记录存储集当前的数据大小。RecordEnumeration enumerate Records(RecordFilterfilter,RecordComparator,bool-ean keepUpdataed)返回一个RecordEnumerator对象。它是用来在一个记录集合中枚举的(使用comparator参数)。与时间有关的方法Void addRecordListener(RecordListener listener)加入一个监听器对象,它可以在有这个记录存储集消息的时候被调用。Void removeRecordLisrener(RecordListener listener)移除原来用addRecordListener方法加入的监听器对象。记录存储集在与MIDlet包范围,也就是说同一个包的任何MIDlet都可以访问这个包中的记录存储集,其他包中的MIDlet甚至不能感知到别的包里记录存储集的存在。2.4.6 记录一个记录就是一个字节数组,可以在里面写任何格式的数据。可以用DataInputStream、DataOutputStream往记录中写入数据,也可以用ByteArrayInputStream和ByteArrayOutputStream。在记录存储集中记录是以一种类表的结构存储,如下图2-2所示: IDRecord data(byte array)1“John”2 “64997”3 .png image data - _图2-2 Record data Store “A”每一个记录和它相关的字节数组都有一个整数主键唯一来标识,RMS会成为记录设定ID。头一个写入的ID是1,每次增加一条记录它的ID就增加1,上图展示了一个记录集的简单用法。在这个例子中,玩家的名字(字符串“John”)存储在记录1中,记录2保存最高分,记录3是先前从网络上下载的缓存的图象。2.4.7 异常RMS异常都是因为不正确的环境造成的,对于这些异常需要编写代码来处理问题(RecordStoreNotFoundException、RecondStoreNotOpenException、InvalidRecordIDExcepaion的情况),或者只能接受它。2.5 用户界面(LCDUI)在创建游戏时,MIDP允许我们使用两种截然不同的界面系统高级UI和低级UI。2.5.1 UI基础LCDUI的核心是screen的概念,它代表MID上的一个display,在任何一个时间点,只能有一个screen可见。在LCDUI中有3种类型的screen:(1) 低级UI可以通过Canvas类访问;(2) Form显示一组简单的UI组件,或者说控件;(3) 复杂组件(Complex components)。2.5.2 高级UI高级UI提供了MID的一个抽象接口,通过它可以获得大量的功能。使用高级API首先创建组件把它们加入到屏幕,然后与它们相交互。高级UI一般划分为两大类:屏幕和组件。(1) 屏幕(screen)screen是一个完整类组件,它管理整个屏幕。Form是一个特殊的screen,可以在Form中由少量几个组件来构造一个screen。(2) 列表(List)List是一个可以给用户显示一组备选项的组件。这个类实现了Javax.microedition.lcdui.Choice接口,ChoiceCroup item也实现了这个接口。(3) 文本框(TestBox)TestBox组件是微型世界的字处理器,它只能输入多行的文字。它可以让玩家输入多行文字、剪切、复制以及从剪切板粘帖、过滤输入的数据。(4) 警告(Alert)可以使用它来显示一个提示信息(因为它是一个screen,所以它接管整个屏幕)。(5) Form和ItemForm是一种可以包含一个或者多个下面这些从Item类派生出来的组件的screenStringItem、ImageItem、TextField、ChoieGroup、DataField和Gauge。(6) StringItem类运用StringItem类在Form上加入简单的文字消息。2.5.3 低级UI低级UI提供了一个工具包来移动和绘制图形、显示文字、获取直接的按键事件等。(1) Canvas类Canvas又称画布,是一个Displayable对象,所有绘图操作都画在它上面。(2) Graphics类Graphics类工具在Canvas中承担基本的二维绘图。(3) 二维绘图工具drawLine采用4个参数直线起点的x、y坐标值和直线终点x、y的坐标值,例如:graphics.drawLine(50,0,100,0);这行代码会从位置(50,0)到(100,0)绘制一条直线。绘制一个矩形是一个类似的过程,不同的只是需要用起点加上宽度和高度的方式来指定这个对象,可以绘制透明的或者填充的矩形,甚至可以绘制圆角的矩形。4个绘制矩形的方法是:drawRect、drawRoundedRect、fillRect和fillRoundedRect。弧是使用6 个参数来绘制的,前3个参数是弧所在的整个圆的外切矩形。剩下的两个参数是startAngle和arcAngle。Angle是度数,0为右侧(在三点的位置)的地方,180是左侧(在九点的位置)的位置。(4) 绘制文字可以使用方法drawChar、drawChars、drawString和drawSubstring在Canvas上面绘制文字。(5) 图象和裁剪裁剪让人可以把图象输出限制到显示设备的一个特定区域中,例如,如果将输出限制在一个从(10,10)开始到(50,50)的区域中,那么从那个时候起,没有图像会出现在显示设备上这个区域之外的任何地方。(6) 事件响应实现一个或者多个按键事件响应方法:keyPressde、keyRleased和keyRepeated。第三章 手机游戏开发过程3.1 贪吃蛇游戏的规则简介以及开发环境3.1.1 贪吃蛇游戏的规则简介在贪吃蛇游戏中,玩家操作由小方块连接而成的蛇,去吃随机散落在画面内的小方块,每吃一块就增加一小方块长度,要是撞壁以及撞自己的尾,就属于失败,如无失败则直到通关为止。屏幕的长度的行向为11单位,纵向为18单位。在这个范围内,玩家通过操作方向键来控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。3.1.2 开发环境(1)开发的硬件环境:CPU C1.7HZ/Maxor 40G/DDR 256M/CD-ROW 40X (2)开发软件:JDK1.3和J2MEWTK3.2 详细设计本游戏的操作流程(如图3-1):用户在启动MIDlet后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下开始按钮后,就可以开始玩游戏。当用户想暂停时,再次按一下开始按钮,游戏就暂停了,在暂停的情况下再按开始按钮,游戏继续运行。任何时候按退出按钮,游戏MIDlet都会终止。图 3-1操作流程3.2.1 代码设计 (1)游戏地图代码设计 游戏地图是蛇的活动范围和食物随机散落的范围,游戏的容器为行向为11单位,纵向为18单位,如下代码:private final int iX = 10;/地图的开始坐标 private final int iY = 10;/private final int SWIDTH = 16;/图标的宽度 private final int iCells = 11;/地图的列数 private final int iRows = 18;/地图的行数 private final int iBoxW = SWIDTH*iCells;/地图的宽采用二维绘图工具:二维绘图工具drawLine采用4个参数直线起点的x、y坐标值和直线终点x、y的坐标值,例如:graphics.drawLine(50,0,100,0);这行代码会从位置(50,0)到(100,0)绘制一条直线。绘制一个矩形是一个类似的过程,不同的只是需要用起点加上宽度和高度的方式来指定这个对象。可以绘制透明的或者填充的矩形,甚至可以绘制圆角的矩形。4个绘制矩形的方法是:drawRect、drawRoundedRect、fillRect和fillRoundedRect。(2)贪吃蛇和食物的代码设计屏幕的长度为行向为11单位,纵向为18单位;在这个范围内(如图3.3),玩家操作方向键控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。图3-3游戏区域贪吃蛇最初由3个小正方形组成,小正方形是蛇的身体和游戏容器的组成部分。食物也由一块小正方形组成,并且随机散落在游戏框图的区域内,每次只出现唯一的一个,待玩家操作游戏完成一个任务后面,再出现下个食物,小蛇每吃一个食物就增加一个长度。实现代码如下:public int getCell()return iCell;public int getRow()return iRow; public void show() sLabel.setVisible(true); public boolean isVisible() return sLabel.isVisible(); public void hide() sLabel.setVisible(false); protected void setPosition(int row, int cell)iCell = cell;iRow = row; sLabel.setBounds(cell*SWIDTH, row*SWIDTH, SWIDTH, SWIDTH); public void moveUp()if(iRow0)setPosition(-iRow,iCell);elsesetTouch();public void moveDown()if(iRow0)setPosition(iRow,-iCell);elsesetTouch();public void moveRight()if(iCelliBoxW-1)setPosition(iRow,+iCell);elsesetTouch();static boolean getTouch()return isTouch;static void setTouch()isTouch = true;static void setImTouch()isTouch = false;public Snake clone()Snake tem = new Snake();tem.setPosition(this.getRow(),this.getCell();return tem;(3)操作控制代码设计MIDP的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDlet后,就立即生成一个重绘线程,该线程每隔50ms绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些已经固定下来的就不需重绘。游戏画布是一个CommandListener,可以接受用户键盘命令,控制蛇的左移,右移,下移,上移。其代码如下:public void move()hide();if(aoSnakes0.getRow()=Food.getRow()&aoSnakes0.getCell()=Food.getCell()eat();Snake tempSnakes = new SnakeiLen-1;for(int i=0;itempSnakes.length;i+)tempSnakesi = aoSnakesi.clone();switch(heading)case 37:aoSnakes0.moveLeft();break;case 38:aoSnakes0.moveUp();break;case 39:aoSnakes0.moveRight();break;case 40:aoSnakes0.moveDown();break;default:break;整个游戏的流程控制体现在游戏画布对象的paint()方法里。paint()根据当前的游戏状态,绘制出当时的游戏画面。欢迎画面和Game Over画面的绘制相当简单,游戏暂停画面的绘制也相当容易,就是设立标志,让paint()执行的时候无需真正执行重绘动作。第四章 程序的调试与运行4.1游戏的调试在手机游戏方面,游戏的控制和图片的设置是游戏的基本能力,为了方便玩家操作游戏,把玩家常用的操作键设为游戏最常用的控制键,并通过J2ME简单有效的编码,使玩家可以重新设置自己的熟悉的键。本游戏不设立关卡,而是随着游戏积分的增加,游戏将自动增加游戏的难度,如加快游戏速度和随小蛇长度的增加,游戏的操作难度也会增大。如玩家进入游戏(如图4-1),操作小蛇,图 4-1 游戏界面图去吃随机散落在游戏区内的食物,每吃一个食物就增加小蛇一个单位长度,并随着长度的增加,游戏的速度将增加,而小蛇的长度增加也会增加玩家的操作难度。如果玩家操作小蛇碰壁或者由于小蛇长度太长而蛇头撞到小蛇的身体任何部位,均属于失败,玩家得重新游戏开始(如图4-2)。但游戏将自动纪录你的得分,并且保存你的游戏最高得分。 图 4-2 游戏失败的两种情况4.2 游戏的运行环境目标硬件环境:1:显示: 96*54象素,1位颜色, 大约1:1的象素比例;2:输入:(a)单手键盘或者小键盘;(b)双手的QWERTV键盘;(c)触摸屏。 3)内存 (a)128KB非易失性内存,供MIDP组件使用;(b)8KB的非易失性内存,供应用程序生成的永久数据使用;(c)32KB的易失性内存,供Java堆使用。4)网络 (a)双响无线网络,可能间歇性连接;(b)通常是很有限的带。结束语本次毕业设计所开发的手机游戏,实现了手机游戏的一些基本和必需的功能。如游戏的界面设置,游戏动画的设置,玩家的控制键设置,游戏的保存和游戏纪录的保存,游戏的开始和暂停等功能。但游戏功能还存在着很多不足,首先,对游戏的动画设计不够熟悉,技巧性不强,界面的设置也不够美观。这些对于玩家来说是非常重要,将直接决定本游戏的生存能力。其次,这款游戏还没直接下载到手机上去实现,只是通过模拟器在PC机上实现。另外此次所使用的开发工具都是用的JDK的较低版本,有些功能不能实现。这次游戏的功能没能做到十全十美,是由于自身能力的不足和时间的限制,没有对游戏的开发进行进一步研究,还有很多地方需要改进。致 谢一个多月的毕业设计,培养了我接受新事物的能力、理论分析的能力、实践操作的能力以及发现并解决问题的能力。并且,通过这次毕业设计开阔了我的视野,增添了自己挑战的信心,认准了自己努力的方向。在实现的过程当中得到很多人的帮助,在此,要特别感谢吕树红老师耐心细致的指导,使我从中受益匪浅。参考文献1 Martin J.Wells.J2ME游戏编程M.北京:清华大学出版社.2005.32米川英树.手机游戏程序设计M.北京:中国铁道出版社.20053孙淑敏.Java2游戏开发北京M.北京:清华大学出版社.20054 张小玮.J2ME无线应用开发 M. 北京:清华大学出版社.20055张白一.面向对象程序设计JavaM.西安:西安电子科技大学出版社.2002.86史斌星.Java基础编程贯通教材 M. 北京:清华大学出版社.20057杨绍方.Java 程序基础设计 M. 北京:科学出版社.20058朱喜福.Java程序设计 M. 北京:清华大学出版社.2004.79 Elliotte Rusty HaroldJ.Java网络编程M.北京:中国电力出版社.2001.110马海军.Java编程原理与实践. M.北京:清华大学出版社.22005袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇羅膃蚈螂羁膂莈蚅袇膁蒀袀螃膀薂蚃肂腿节衿羈腿莄蚂袄芈蒇袇螀芇蕿蚀聿芆艿蒃肅芅蒁螈羁芄薃薁袆芃芃螆螂芃莅蕿肁节蒈螅羇莁薀薈袃莀艿螃蝿荿莂薆膈莈薄袁肄莇蚆蚄羀莇莆袀袆羃蒈蚂螂羂薁袈肀肁芀蚁羆肁莃袆袂肀薅虿袈聿蚇蒂膇肈莇螇肃肇葿薀罿肆薂螆袅肅芁薈螁膅莃螄聿膄蒆薇袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈蚅蚄膈膄蚄螇羁蒂蚃衿膆莈蚂羁罿芄螁蚁膄膀螁螃羇葿螀袅膃蒅蝿肈羆莁螈螇芁芇莄袀肄膃莄羂艿蒂莃蚂肂莈蒂螄芈芄蒁袆肀膀蒀罿袃薈葿螈聿蒄葿袁羁莀蒈羃膇芆蒇蚃羀膂蒆螅膅蒁薅袇羈莇薄罿膄芃薃虿羆艿薃袁节膅薂羄肅蒃薁蚃芀荿薀螆肃芅蕿袈芈膁蚈羀肁蒀蚇蚀袄莆蚇螂肀莂蚆羅袂芈

温馨提示

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

评论

0/150

提交评论