版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、湖 南 科 技 大 学毕 业 设 计( 论 文 )题目基于JAVA的电话管理系统的设计作者 学院 信息与电气工程学院专业 通信工程学号 指导教师 唐东峰二一一 年 六月 一日湖 南 科 技 大 学毕业设计(论文)任务书 院 系(教研室)系(教研室)主任: (签名) 年 月 日学生姓名: 学号: 专业: 1 设计(论文)题目及专题: 2 学生设计(论文)时间:自 年 月 日开始至 年 月 日止3 设计(论文)所用资源和参考资料:4 设计(论文)应完成的主要内容:5 提交设计(论文)形式(设计说明与图纸或论文等)及要求:6 发题时间: 年 月 日指导教师: (签名)学 生: (签名)湖 南 科 技
2、 大 学毕业设计(论文)指导人评语主要对学生毕业设计(论文)的工作态度,研究内容与方法,工作量,文献应用,创新性,实用性,科学性,文本(图纸)规范程度,存在的不足等进行综合评价指导人: (签名)年 月 日 指导人评定成绩: 湖 南 科 技 大 学毕业设计(论文)评阅人评语主要对学生毕业设计(论文)的文本格式、图纸规范程度,工作量,研究内容与方法,实用性与科学性,结论和存在的不足等进行综合评价评阅人: (签名)年 月 日 评阅人评定成绩: 摘要 随着信息化时代的发展,通信市场的逐步扩大,电话、手机等通信设备已经离不开人们的生活,这时如何对日常的电话进行有序、合理的管理显得尤为重要。本文设计的是基
3、于JAVA语言设计的一个电话管理系统。本系统将通话记录存放在文本文件中,读取记录时从文件中将记录反序列化成存放记录的容器Vector对象,写入记录时将存储记录的Vector对象序列化存入文本文件。手机的模拟界面利用JAVA UI进行设计,由于手机的通信过程难以实现,本系统通过Socket网络编程模拟实现,将手机等通信终端当成客户端,中间的通信过程通过服务器模拟实现,通过服务器作为桥梁实现客户端与客户端的通信。本系统能实时对已接来电、未接来电、已拨电话进行记录,而且能对记录下来的电话进行再次呼叫,用户对来电可以进行模拟的接通或挂断操作。 【关键词】客户端 服务器 Socket网络编程 Vecto
4、r 多线程ABSTRACT With the development of the Network Technology and the gradual expansion of communication market, communication equipments like telephone, mobile phone have been inseparable from peoples lives.Therefore, orderly and rational management of our daily telephone is particularly important .
5、 What we design in this article is a telephone management system based on the JAVA language . The information of call records in this system stored in text files.When the system reads the records from the file,the information of those files will be deserialized into a Vector object storing records.W
6、hen the system writtens records ,Vector object storing records will be serialized into text files. Analog of phone s interface designed by JAVA UI . Because the communication process of phones is difficult to achieve , the system achieved it by simulation Socket Network Programming. Mobile phones an
7、d other communication terminals are regarded as the client, the communication process in the middle of clients is achieved through the server .The system achieves the communications between clients by the server who plays as a bridge . The system can received calls, missed calls, dialed calls record
8、ed at real-time, and the telephones received can be called again . In addition ,the users can carry out operations like connecting to someone or hanging up the call. Keywords: client server Socket network programming Vector multi-threaded 目 录TOC o 1-8 h u HYPERLINK l _Toc15780 第一章 绪论 PAGEREF _Toc157
9、80 1 HYPERLINK l _Toc10996 1.1课题研究背景和意义 PAGEREF _Toc10996 1 HYPERLINK l _Toc7148 1.2 研究目标 PAGEREF _Toc7148 1 HYPERLINK l _Toc25336 1.3 研究内容 PAGEREF _Toc25336 1 HYPERLINK l _Toc12778 第二章 开发环境及相关原理介绍 PAGEREF _Toc12778 3 HYPERLINK l _Toc17157 2.1 JDK(Java Development Kit) PAGEREF _Toc17157 3 HYPERLINK
10、l _Toc5967 2.1.1 JDK基本组件 PAGEREF _Toc5967 3 HYPERLINK l _Toc16207 2.1.2JDK常用包 PAGEREF _Toc16207 3 HYPERLINK l _Toc26021 2.3 java图形界面 PAGEREF _Toc26021 4 HYPERLINK l _Toc12502 2.3.1 Swing 的角色 PAGEREF _Toc12502 4 HYPERLINK l _Toc2332 2.3.2 JComponent PAGEREF _Toc2332 4 HYPERLINK l _Toc13678 2.3.3 JBut
11、ton PAGEREF _Toc13678 5 HYPERLINK l _Toc10487 2.3.4 JFrame PAGEREF _Toc10487 5 HYPERLINK l _Toc23821 2.3.5 JTextArea PAGEREF _Toc23821 6 HYPERLINK l _Toc27693 2.3.6 JList PAGEREF _Toc27693 6 HYPERLINK l _Toc30293 2.3.7 BorderLayout PAGEREF _Toc30293 7 HYPERLINK l _Toc17460 2.4 Java 多线程 PAGEREF _Toc1
12、7460 7 HYPERLINK l _Toc7358 2.4.1多线程概念 PAGEREF _Toc7358 7 HYPERLINK l _Toc30489 2.4.2 在Java中实现多线程 PAGEREF _Toc30489 8 HYPERLINK l _Toc31952 2.5 java socket编程 PAGEREF _Toc31952 9 HYPERLINK l _Toc11079 2.5.1网络编程中两个主要的问题 PAGEREF _Toc11079 9 HYPERLINK l _Toc10045 2.5.2两类传输协议:TCP;UDP PAGEREF _Toc10045 9
13、HYPERLINK l _Toc2742 2.5.3 Socket概念 PAGEREF _Toc2742 10 HYPERLINK l _Toc20973 2.5.4 Socket通讯的过程 PAGEREF _Toc20973 10 HYPERLINK l _Toc82 2.5.5创建Socket PAGEREF _Toc82 10 HYPERLINK l _Toc7729 2.6 Vector 类 PAGEREF _Toc7729 12 HYPERLINK l _Toc27100 2.6.1 在JAVA中的详细说明 PAGEREF _Toc27100 12 HYPERLINK l _Toc3
14、0131 2.6.2插入功能 PAGEREF _Toc30131 13 HYPERLINK l _Toc10645 2.6.3删除功能 PAGEREF _Toc10645 13 HYPERLINK l _Toc23530 2.6.4查询搜索功能 PAGEREF _Toc23530 13 HYPERLINK l _Toc7788 2.7 Java中对象的序列化与反序列化 PAGEREF _Toc7788 14 HYPERLINK l _Toc16401 2.7.1 序列化简介 PAGEREF _Toc16401 14 HYPERLINK l _Toc32401 2.7.2序列化机制 PAGERE
15、F _Toc32401 14 HYPERLINK l _Toc31733 2.7.3 处理对象流:(序列化过程和反序列化过程) PAGEREF _Toc31733 15 HYPERLINK l _Toc12177 2.7.4 定制序列化过程 PAGEREF _Toc12177 15 HYPERLINK l _Toc19989 2.7.5 完全定制序列化过程 PAGEREF _Toc19989 16 HYPERLINK l _Toc20589 第三章 需求分析及可行性研究 PAGEREF _Toc20589 17 HYPERLINK l _Toc3398 3.1系统需求分析 PAGEREF _T
16、oc3398 17 HYPERLINK l _Toc20319 3.1.1 功能需求 PAGEREF _Toc20319 17 HYPERLINK l _Toc20888 3.1.2 性能需求 PAGEREF _Toc20888 17 HYPERLINK l _Toc17043 3.2 数据流图 PAGEREF _Toc17043 18 HYPERLINK l _Toc21785 3.2.1 总体数据流图 PAGEREF _Toc21785 18 HYPERLINK l _Toc18388 3.2.2具体数据流图 PAGEREF _Toc18388 18 HYPERLINK l _Toc836
17、8 3.3 系统可行性研究 PAGEREF _Toc8368 19 HYPERLINK l _Toc13089 3.3.1 经济可行性 PAGEREF _Toc13089 19 HYPERLINK l _Toc21550 3.3.2技术可行性 PAGEREF _Toc21550 19 HYPERLINK l _Toc6551 3.3.3运行可行性 PAGEREF _Toc6551 19 HYPERLINK l _Toc31395 3.3.4操作可行性 PAGEREF _Toc31395 19 HYPERLINK l _Toc732 第四章 总体设计 PAGEREF _Toc732 20 HYP
18、ERLINK l _Toc27270 4.1 系统总体结构体系 PAGEREF _Toc27270 20 HYPERLINK l _Toc27445 4.2 图形界面模块 PAGEREF _Toc27445 20 HYPERLINK l _Toc22548 4.3 数据读写模块 PAGEREF _Toc22548 21 HYPERLINK l _Toc17129 4.4 通信模块 PAGEREF _Toc17129 21 HYPERLINK l _Toc13185 第五章 详细设计及实现 PAGEREF _Toc13185 23 HYPERLINK l _Toc15903 5.1 系统总体流程
19、图 PAGEREF _Toc15903 23 HYPERLINK l _Toc31232 5.2 界面的具体实现 PAGEREF _Toc31232 24 HYPERLINK l _Toc8289 5.2.1 java事件处理 PAGEREF _Toc8289 24 HYPERLINK l _Toc6050 5.2.2 主要的界面类 PAGEREF _Toc6050 26 HYPERLINK l _Toc18782 5.2.3手机键盘的封装类keyboardPanel PAGEREF _Toc18782 26 HYPERLINK l _Toc10657 5.2.4 已接来电、未接来电、已拨电话
20、的界面 PAGEREF _Toc10657 27 HYPERLINK l _Toc13480 5.2.5 拨号输入界面的实现 PAGEREF _Toc13480 28 HYPERLINK l _Toc11155 5.2.6 界面切换流程 PAGEREF _Toc11155 28 HYPERLINK l _Toc27778 5.3 数据读写模块 PAGEREF _Toc27778 29 HYPERLINK l _Toc12178 5.3.1 通话记录的读写 PAGEREF _Toc12178 29 HYPERLINK l _Toc12282 5.3.2 客户端与服务器之间的数据读写 PAGERE
21、F _Toc12282 30 HYPERLINK l _Toc105 5.3.3序列化与反序列化的具体实现 PAGEREF _Toc105 31 HYPERLINK l _Toc20187 5.3.4 Vector类 PAGEREF _Toc20187 32 HYPERLINK l _Toc17973 5.4网络通信的实现 PAGEREF _Toc17973 33 HYPERLINK l _Toc4678 5.4.1登录离线过程的具体实现 PAGEREF _Toc4678 33 HYPERLINK l _Toc18728 5.4.2 模拟客户端之间通话过程的具体实现 PAGEREF _Toc1
22、8728 34 HYPERLINK l _Toc32492 第六章 程序测试和结果分析 PAGEREF _Toc32492 35 HYPERLINK l _Toc2898 6.1 模块测试 PAGEREF _Toc2898 35 HYPERLINK l _Toc26176 6.2 功能测试 PAGEREF _Toc26176 35 HYPERLINK l _Toc31114 6.3 测试结果 PAGEREF _Toc31114 36 HYPERLINK l _Toc9757 6.4 个人总结 PAGEREF _Toc9757 38 HYPERLINK l _Toc13568 参考文献 PAGE
23、REF _Toc13568 40致谢41 HYPERLINK l _Toc12978 附录A PAGEREF _Toc12978 42 HYPERLINK l _Toc16892 1.键盘封装类KeyboardPanel()42 HYPERLINK l _Toc9392 2.通话界面程序CallingUi() PAGEREF _Toc9392 44 HYPERLINK l _Toc3529 3.客户端启动程序phoneClient() PAGEREF _Toc3529 47 HYPERLINK l _Toc5650 4.服务器启动程序server() PAGEREF _Toc5650 50 H
24、YPERLINK l _Toc3306 5.服务器和客户端建立连接后的响应程序Connection() PAGEREF _Toc3306 51第一章 绪论1.1课题研究背景和意义 回顾我国移动电话10多年的发展历程,我国移动通信市场的发展速度和规模令世人瞩目,中国的移动电话发展史是超常规、成倍数、跳跃式的发展史。自1987年中国电信开始开办移动电话业务以来到1993年用户增长速度均在200%以上,从1994年移动用户规模超过百万大关,移动电话用户数每年几乎比前一年翻一番。1997年7月17日,我国移动电话第1000万个用户在江苏南京诞生,标志着我国移动通信又上了一个台阶,它意味着中国移动电话用
25、不到10年时间所发展的用户数超过了固定电话110年的发展历程。2001年8月,中国的移动通信用户数超过了1.2亿,已超过美国跃居为世界第一位。2003年6月底移动电话用户总数已达2.3447亿户。目前我国移动通信网的增长速度名列世界第一位,移动用户总数跃居世界第一位。 中国信息产业部最新统计显示, 由于手机资费近年来的大幅下降,手机用户数进入高增长期,截至2007年末,中国手机普及率已达41.6%。 截至07年12月,全国手机用户数约达5.47亿户,普及率达41.6,截止09年12月份,全行业手机用户数共达到7.26亿户,其中,中国移动用户总数达到5.22亿户,中国联通用户数升至1.476亿,
26、中国电信则达到5609万户。移动电话的迅猛增长以及手机的广泛普及,必然的导致用户的增加,因此如何对日常的电话进行有序、合理的管理显得尤为重要。1.2 研究目标 本课题主要研究如何对手机客户端的通话记录进行管理,能实时的对已接,未接,已拨电话进行记录,并能进行自主的删除。同时还要利用文件操作的方式将记录保存,从而保证每次开关机都不会遗失通话记录。手机界面的模拟利用Java中的Swing和awt包。另外,具体的通信过程通过java Socket网络编程模拟。1.3 研究内容 本课题主要利用Java较为常用的技术,如UI图形界面、Socket编程、文件流操作、容器Vector、序列化反序列化等。主要
27、模块有图形界面模块,数据读写模块,网络通信模块。具体的研究内容包括:1.利用Java UI知识画出一个简单的手机模拟器,能实现手机拨打电话和查询通话记录的功能,全部操作通过手机模拟器上的键盘完成,并能进行手机相应操作界面的切换。2.手机的查询记录功能,通过读取文件到相应JList列表显示出来,并能对记录进行删除操作。同时,能实时的对已接,未接,已拨电话进行记录。3.手机的通信过程通过Socket网络通信模拟,将手机终端看做客服端,基站及中间过程通过服务器实现,通过服务器作为桥梁实现客户端与客户端的通信。 第二章 开发环境及相关原理介绍2.1 JDK(Java Development Kit)J
28、DK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的第一步。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。 JDK基本组件 javac 编译器,将源程序转成字节码 jar 打包工具,将相关的类文件打包成一个文件 javadoc 文
29、档生成器,从源码注释中提取文档 jdb debugger,查错工具 java 运行编译后的java程序(.class后缀的) Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示 字节代码含义。2.1.2JDK常用包 java.lang: 这个是系统的基础类,比如String等都是这里面的,这个包是唯一一个可 以不用引入(import)就可以使用的包 java.io: 这里面是所有输入输出有关的类,比如文件操作等 java.awt:抽象窗口工具,用于图形界面的包 Java.awt.event:用于相应事件的处理 Java.swing:新增的图形界面的包 : 这里面是与网络
30、有关的类,比如URL,URLConnection等。 java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等。 2.2 eclipse eclipse-galileoEclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。 Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其
31、他计算机语言比如C+和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。 基于 Eclipse 的应用程序的突出例子是 IBM 的 WebSphere Studio Workbench,它构成了 IBM Java 开发工具系列的基础。例如,WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、Web 服务和数据库访问的支持。 Eclipse的主要组成 Eclipse是一个
32、开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成Eclipse Platform、JDT、CDT和PDE.JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始
33、。 Eclipse SDK(软件开发者包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以 CPL发布,第三方组件有各自自身的许可协议.2.3 java图形界面 Swing 的角色 Swing 是 Java 平台的 UI 它充当处理用户和计算机之间全部交互的软件。它实际上充当用户和计算机内部之间的中间人。它提供了
34、处理前面一节中描述的 UI 各方面内容的机制:键盘:Swing 提供了捕捉用户输入的方法。 颜色:Swing 提供改变在屏幕上看到的颜色的方法。 打字的地址栏:Swing 提供了文本组件,处理所有普通任务。 音量:Swing 不太擅长。 JComponent Swing 的整个可视组件库的基础构造块是 JComponent。它是所有组件的父类。它是一个抽象类,所以不能创建 JComponent,但是作为类层次结构的结果,从字面意义来说它包含了数百个函数,Swing 中的每个组件都可以使用这些函数。显然,有些概念要比其他概念重要,所以对于本教程,需要学习的重要的东西是:JComponent 不仅
35、是 Swing 组件的基类,还是定制组件的基类。它为所有组件提供了绘制的基础架构 一些方便进行组件定制的东西。它知道如何处理所有的键盘按键。所以类只需要侦听特定的键。 它包含 add() 方法,可以添加其他 JComponent。换种方式来看,可以把任意 Swing 组件添加到其他任何 Swing 组件,从而构造嵌套组件(例如,JPanel 包含 JButton,甚至包含一些古怪的组合,例如 JMenu 包含 JButton)。 JButton Swing 中的基本动作组件 JButton,是与每个窗口中都能看到的 OK 和Cancel 一样的按钮;这些按钮所做的正是在单击它们之后,将发生一些
36、事情。 用来改变 JButton 属性的方法与 JLabel 的方法类似。它们控制文本、图片和方向:get/setText(): 获取/设置标签的文本。 get/seticon(): 获取/设置标签的图片。 get/setHorizontalAlignment(): 获取/设置文本的水平位置。 get/setVerticalAlignment(): 获取/设置文本的垂直位置。 get/setDisplayedMnemonic(): 获取/设置访问键(下划线字符),与 Alt 按钮组合时,造成按钮单击。 JFrame JFrame 类就是做这个的它是一个容器,允许您把其他组件添加到它里面,把它们
37、组织起来,并把它们呈现给用户。JFrame 实际上不仅仅让您把组件放入其中并呈现给用户。比起它表面上的简单性,它实际上是 Swing 包中最复杂的组件。为了最大程度地简化组件,在独立于操作系统的 Swing 组件与实际运行这些组件的操作系统之间,JFrame 起着桥梁的作用。JFrame 在本机操作系统中是以窗口的形式注册的,这么做之后,就可以得到许多熟悉的操作系统窗口的特性:最小化/最大化、改变大小、移动。可以在 JFrame 上调用的一些修改属性的方法是:get/setTitle(): 获取/设置帧的标题。 get/setState(): 获取/设置帧的最小化、最大化等状态。 is/set
38、Visible(): 获取/设置帧的可视状态,换句话说,是否在屏幕上显示。 get/setLocation(): 获取/设置帧在屏幕上应当出现的位置。 get/setsize(): 获取/设置帧的大小。 add(): 将组件添加到帧中。 JTextArea JTextArea 支持多行文本。可以把它想像成一个空白页,可以在其中的任意地方进行输入。JTextArea可以在其中输入内容,另外JTextArea 提供了一些额外的重要功能,这些功能包括单词自动换行的能力(即把长文本自动换行到下一行,而不是将单词从中断开)、对文本自动换行的能力(即把长的文本行移动到下一行,而不是创建一个需要水平滚动条的
39、非常长的行)。 支持行和单词的自动换行的重要方法是:is/setLineWrap():设置在行过长的时候是否要自动换行。 is/setWrapStyleWord():设置在单词过长的时候是否要把长单词移到下一行。 JList JList 是一个有用的组件,用于向用户呈现许多选择。可以把它当作 JComboBox 的扩展。JList 提供了更多选择,并添加了多选的能力。在 JList 与 JComboBox 之间进行选择通常取决于以下两个特性:如果需要多选,或者选择的选项超过 15 个(虽然这个数字并不是通用规则),那么就应当选择 JList。应用将 JList 与 JScrollPane 结合
40、使用,因为它能够呈现比它的空间所能容纳的更多的选项。 JList 包含选择模型的概念(在 JTable 中也会看到),在这里,可以设置 JList 接受不同类型的选择。这些类型是:单一选择(只能选择一项)、单一间隔选择(只能选择相邻选项),以及任意多项或者多项间隔选择(可以选择任意数量、任意组合的选择)。 JList 中有许多处理数据的函数,而且根据我的说法,这些也只不过是使用 JList 的细节的皮毛而已。以下是一些基本方法:get/setSelectedIndex():获取/设置列表中选中的行;在多选择列表的情况下,返回一个 int。 get/setSelectionMode():与上面解
41、释的一样,获取/设置选择模式,模式有:单一、单一间隔和多选间隔。 setListData():设置在 JList 中使用的数据。 get/setSelectedValue():获得选中的对象(与选中行号对应)。 BorderLayoutBordderLayout是容器Frame和Dialog默认的布局管理器,它把容器简单地划分为东、西、南、北、中五个区域,每加入一个组件都应该指明把这个组件加在哪个区域。分布在北部和南部区域的组件将横向扩展至 占据整个容器的长度,分布在东部和西部的组件将伸展至占据容器剩余部分的全部宽度,最后剩余部分将分配给中央的组件。如果某个区间没有分配组件,则其它组件可以占据
42、它的空间。例如,如果北部没有分配组件,则西部 和东部的组件将扩展到容器的上方,如果西部和东部没有分配组件,则位于中央的组件将横向扩展到容器的左右边界。BorderLayout的构造方法有两种 BorderLayout();BorderLayout(int hgap,int vgap);hgap及vgap指组件间的间距,默认为0个像素 GridLayoutGridLayout是使用最多的布局管理器,其基本布局策略是把容器的空间划分成若干行若干列的网格区域,组件就位于这些 划分出来的小格中.GridLayout比较灵活,划分多少网格由程序自由控制,而且组件定位也精确. 使用GridLayout布局
43、布局管理器的一般步骤如下: (1)创建GridLayout对象作为布局管理器.指定划分网格的行数和列数,并使用容器的setLayout()方法为容器设置这个 布局管理器: setLayout(new GridLayout(行数,列数组) (2)调用容器的方法add()将组件加入容器.组件填入容器的顺序将按照第一行第一个、第一行第二个,以此类推,最后一行最后一个。 每网格中都必须填入组件,如果希望某个网格为空白,可以为它加入一个空的标签add(new Label()2.4 Java 多线程多线程概念多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。
44、 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的。 图 多线程 在Java中实现多线程 作为一个完全面向对象的
45、语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便自己的各个线程。Thread 类最重要的方法是 run() ,它为Thread 类的方法 start() 所调用,提供的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它。方法一:继承 Thread 类,覆盖方法 run()。我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。它也有一个很大的缺点,那就是如果类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类。方法二:实现 Runnable 接口Runnable
46、接口只有一个方法 run(),声明自己的类实现 Runnable 接口并提供这一方法,将线程代码写入其中,就完成了这一部分的任务。但是 Runnable 接口并没有任何对线程的支持,还必须创建 Thread 类的实例,这一点通过 Thread 类的构造函数public Thread(Runnable target)来实现。 线程的四种状态1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 dest
47、roy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。4. 阻塞状态:线程不会被分配 CPU 时间,无法执行。线程的优先级 线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。可以调用 Thread 类的方法 getPriority() 和 setPriority()来存取线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之
48、间,缺省是5(NORM_PRIORITY)。2.5 java socket编程网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。 目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提 出申
49、请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也 能及时得到服务。两类传输协议:TCP;UDPTCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输
50、,双方都可以进行发送 或接收操作。TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中cl
51、ient/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。 Socket概念网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。 Socket通讯的过程Se
52、rver端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:(1) 创建Socket;(2) 打开连接到Socket的输入/出流;(3) 按照一定的协议对Socket进行读/写操作;(4) 关闭Socket.创建Socketjava在包中提供了两个类Socket和ServerSocket,分
53、别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。其构造方法如下:Socket(InetAddress address, int port);Socket(InetAddress address, int port, boolean stream);Socket(String host, int prot);Socket(String host, int prot, boolean stream);Socket(SocketImpl impl)Socket(String host, int port, InetAddress localAddr, int localPo
54、rt)Socket(InetAddress address, int port, InetAddress localAddr, int localPort)ServerSocket(int port);ServerSocket(int port, int backlog);ServerSocket(int port, int backlog, InetAddress bindAddr)其中address、host和port分别是双向连接中另一方的IP地址、主机名和端 口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAd
55、dr和 bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可 以用来创建Socket。count则表示服务端所能支持的最大连接数。例如Socket client = new Socket(127.0.01., 80);注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。01023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲
56、突。在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。 图 客户端服务器之间的通信流程2.6 Vector 类 在JAVA中的详细说明Java.util.Vector提供了向量(Vector)类以实现类似动态数组的功能。在Java中是没有指针概念的,但如果能正确灵活地使用指针又确实可以大大提高程序的质量,比如在C、C+中所谓“动态数组”一般都由指针来实现。为了弥补这点缺陷,Java提供了丰富的类库来方便编程者使用,Vector类便是其中之一。事实上,灵活使用数组也可完成向量类的功能,但
57、向量类中提供的大量方法大大方便了用户的使用。 相对于ArrayList来说,Vector线程是安全的,也就是说是同步的创建了一个向量类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型也不需预先选定向量的容量,并可方便地进行查找。对于预先不知或不愿预先定义数组大小,并需频繁进行查找、插入和删除工作的情况,可以考虑使用向量类。向量类提供了三种构造方法: public vector() public vector(int initialcapacity,int capacityIncrement) public vector(int initialcapacity) 使用第一种方法,系统
58、会自动对向量对象进行管理。若使用后两种方法,则系统将根据参数initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时,系统会扩充向量对象的存储容量。参数capacityIncrement给定了每次扩充的扩充值。当capacityIncrement为0时,则每次扩充一倍。利用这个功能可以优化存储。在Vector类中提供了各种方法方便用户使用: 插入功能 (1)public final synchronized void addElement(Object obj) 将obj插入向量的尾部。obj可以是任何类的对象。对同一个向量对象,可在其中插
59、入不同类的对象。但插入的应是对象而不是数值,所以插入数值时要注意将数值转换成相应的对象。 例 要插入一个整数1时,不要直接调用v1.addElement(1),正确的方法为: Vector v1=new Vector(); Integer integer1=new Integer(1); v1.addElement(integer1); (2)public final synchronized void setElementAt(object obj,int index) 将index处的对象设成obj,原来的对象将被覆盖。 (3)public final synchronized void
60、insertElementAt(Object obj,int index) 在index指定的位置插入obj,原来对象以及此后的对象依次往后顺延。 删除功能public final synchronized void removeElement(Object obj)从向量中删除obj。若有多个存在,则从向量头开始试,删除找到的第一个与obj相同的向量成员。public final synchronized void removeAllElement() 删除向量中所有的对象。public final synchronized void removeElementlAt(int index)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024至2030年双桶榨水机项目投资价值分析报告
- 2024至2030年全法兰密封塑料容器桶项目投资价值分析报告
- 2024年调心轴承项目可行性研究报告
- 2024年能量活化净水机项目可行性研究报告
- 2024年瓶装饮用纯净水项目可行性研究报告
- 2024年商业区大型广告牌制作与维护协议版
- 2024版软件许可使用合同协议书2篇
- 2024年度企业员工基本薪酬保障合同模板版
- 2024年度固定期限保安服务协议版B版
- 后备人才管理办法
- 大数据建模与应用课程设计
- 公司保险柜使用管理制度
- 资生堂培训资料
- 腔隙性脑梗个案查房课件
- 盐酸丙卡特罗吸入溶液-药品临床应用解读
- 人工智能在体育竞技中的作用
- 2024年人口老龄化挑战与应对
- 联系一具体方案谈谈公共政策环境对公共政策的影响
- 《大数据时代下的数据挖掘》试题和答案与解析
- 耳鼻喉科室年度总结
- 护理循证查房课件
评论
0/150
提交评论