基于Java的聊天室程序设计 - 图文
更新时间:2024-03-29 20:34:01 阅读量: 综合文库 文档下载
- 聊天室程序设计报告推荐度:
- 相关推荐
基于Java的聊天室程序设计
CHAT ROOM PROGRAMMING BASED
ON JAVA
专 业: 计算机科学与技术 姓 名: 指导教师姓名: 申请学位级别: 学 士 论文提交日期:
学位授予单位: 天津科技大学
摘 要
网络聊天室是一种应用广泛的网络聊天方式,操作简单,功能丰富,是教学和学习面向对象的编程思想的理想项目。可以使用多种编程语言和开发功能完善网络聊天室。
本毕业设计论文介绍用Java语言设计和实现一个网络聊天室的过程,本系统采用C/S架构设计,整个项目分为服务器端和客户端。使用最新Java2标准Swing组件,开发出简洁美观和布局合理的用户和服务器界面;利用Socket网络开发急速实现客户端和服务器端的连接访问,实现网络功能;通过对数据流操作的合理设计,实现信息传递、接受和数据保存。同时采用多线程、多任务的设计思想开发出性能稳定,功能全面的服务器。完整的实现系统的功能。
该聊天室工具主要解决了两方面的问题。服务器端和客户端。在服务器端可以实现如下功能:能够处理用户的注册;通过身份验证方式处理用户登录;可以向所有在线用户广播信息;对于不良聊天人士给予警告或者赶出聊天室;删除长久不使用的用户信息;配有操作文档;及时接收用户的服务请求帮助。在客户端可以实现如下功能:聊天信息的传输,支持私聊,支持表情等功能。
关键词:聊天室; Java; Swing组件; Socket技术
I
ABSTRACT
The network chat room is a kind of applied extensive network chat method, operate in case and the function is abundant, It can be used as a good case for learning of Java design language and the Object-Oriented Programming language, There is many programming language of design to develop a network chat room with perfect function.
This graduation thesis of design introduction how to use the Java language design and carry out network chat room, The system adoption the C/S structure design, the whole system is divided into the server and client. Used standard modules of Swing of latest Java2, develop a simple and direct beauty user interface, We make use of the Socket technology to interconnect the server and client by net-work; organize the data by good design of data stream to sent or accept the message between users and to record the message for data ever; we also use the multi-thread to make the program with many function.
This chat room’s tool will solve two main problems, one is server and the other is customer. It will obtain following functions with server: handing the registration of customer; passing verification of body method; processing customer logging; broadcasting information to on-line customers; warning and evicting bad chat personage out of chat room ; deleting long-last the customer information; having operating text; accepting customer’s serving requests. It will obtain following functions with customer: delivering the chat information; supporting private chat; supporting the facial expression; ect.
Key words:chat; Java; Swing component; Socket
II
目 录
第一章 系统开发的意义及需求分析 .................................................... 1 第一节 课题来源..................................................................................... 1 第二节第二章第一节第二节第三节第四节第五节第三章第一节第二节第三节第四章第一节第二节第三节第四节第五章需求分析..................................................................................... 1 系统开发技术 ............................................................................ 2 Java的网络功能与编程 ............................................................ 2 IP/TCP协议常识 ....................................................................... 3 Socket的简介 ............................................................................. 3 Swing的简介 ............................................................................. 6 C/S结构...................................................................................... 7 系统分析与设计方案 ................................................................ 9 开发环境及工具 ........................................................................ 9 聊天系统的总体设计要点 ........................................................ 9 系统的功能模块划分及设计原理 .......................................... 11 系统实现与最终效果 ..............................................................26 系统工作的过程 ...................................................................... 26 使用方法................................................................................... 26 各功能模块运行效果 .............................................................. 26 功能模块测试 .......................................................................... 32 总 结 .........................................................................................33
III
第一节 毕业设计总结和展望 .............................................................. 33 第二节 经验和感想 .............................................................................. 33 参考文献 ...................................................................................................35 致 谢 .......................................................................................................36
IV
天津科技大学2011届本科生毕业设计
第一章 系统开发的意义及需求分析
第一节 课题来源
根据当前网络的需求,网络聊天越来越受到各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过Java语言,对网络编程也较有兴趣,为了更好的考验自己对Java语言的掌握程度,本人就决定以《基于Java的网络聊天室》为毕业设计,希望通过这一次能进一步提高本人的网络开发编程的能力。
第二节 需求分析
聊天系统不外乎两个方面,服务器端和客户端。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器。
服务器端的任务:
1、服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接。
2、服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。
以上就是服务器端最主要的两个任务。不难看出,服务器端的任务并不复杂。 客户端应该完成的工作包括:
1、与服务器端建立通信通道,向服务器端发送信息。 2、接收来自服务器的信息。
相对服务器而言,客户端的任务更加简单,有了以上的简单分析,可以知道,解决上述四个问题,即完成了该聊天系统的核心。
1
天津科技大学2011届本科生毕业设计
第二章 系统开发技术
第一节 Java的网络功能与编程
一、Java概述:
美国硅谷有一句行话,每10年~15年有一次轮回。最近的一次轮回就是从Java开始。Java是一个由Sun公司开发而成的新一代编程语言。使用它可在各式各样不同种机器、不同种操作平台的网络环境中开发软件。不论你使用的是哪一种www浏览器,哪一种计算机,哪一种操作系统,只要www浏览器上面注明了“支持Java”,你就可以看到生动的主页。Java正在逐步成为Internet应用的主要开发语言。它彻底改变了应用软件的开发模式,带来了自PC机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。
Java语言有下面一些特点:简单、面向对象、分布式、解释执行、 安全、体系结构中立、可移植、高性能、多线程以及动态性。
丰富的类库Java提供了大量的类以满足网络化、多线程、面向对象系统的需要。语言包提供的支持包括字符串处理、多线程处理、数学函数处理等,可以用它简单地实现Java程序的运行平台。实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。输入输出包用统一的\流\模型来实现所有格式的I/O,包括文件系统、网络、输入低级网络包用于实现Socket编程。抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件, 包括窗口、菜单、滚动条、对话框等,使得Java可以移植到不同平台的机器。网络包支持Internet的TCP/IP协议,提供了与Internet的接口。 它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。
Java和C、C++对于变量声明、参数传递、操作符、流控制等使用了相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。同时, Java为了实现其简单、安全等特性,也摒弃了C和C++中许多不合理的内容[1]。 二、Java语言在网络上的应用
Java程序可以获取网络上结点的图象、声音、HTML文档及文本等资源,并可以对获得的资源进行处理。例如Java程序可以每隔一定时间读取某结点提供的最新数据,并以图表的形式显示出来。在编程处理上,一般先生成一个URL类型的对象,然后用Java中相应的方法(method)获取该对象所代表的资源。
2
天津科技大学2011届本科生毕业设计
第二节 IP/TCP协议常识
一、IP、TCP协议的特点:
TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议/网际协议的缩写, TCP/IP是当今网络互联的核心协议。TCP/IP协议的体系结构共有四个层次,即应用层、传输层、网络互联层和网络接口层。
IP协议的作用:第一,它是网络层的协议,提供互联网上数据传输的统一格式。第二,提供不可靠的无连接的服务。第三,定义了互联网上的传输数据的基本单元,提供了供路由选择的信息,没有差错校验和处理的机制。
TCP协议的功能:差错控制——可靠性、面向连接、分段(Segment)、端口号。TCP是传输控制协议,是面向连接的提供了一种可靠的传输服务,它用三次握手和滑动窗口机制来保证传输的可靠性,及进行流量控制。 二、TCP/IP协议进行传输数据传输的过程:
应用程序为了传输数据会调用TCP,将数据和对应的参数传给TCP,将TCP数据包封装在IP包内,通过网络送给目的TCP。接收方TCP在接收到数据后通知上层应用程序,TCP将保证接收数据的正确性。在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP 也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,向TCP提供所有TCP需要的服务[2]。 三、端口号:
有的时候,一个ip地址不能完整的标识一台服务器,这是因为一台物理性的计算机同时运行着多个应用程序,这就需要我们来区别同一台机子上的不同的服务,所以就在传输层和应用层上设置接口,就是端口。端口实际是一个16位长的地址,他的范围是0~65535之间,其中0~1023是熟知端口,主要是给提供服务的应用程序使用,这些端口是所有应用进程都知道的,1024~65535为一般端口,也称动态端口、连接端口,用来随时分配要求通信的个客户端应用程序。在数据传输过程中,各种服务器不断的检测分配给他的端口,一边发现要求和他通信的客户端[3]。
第三节 Socket的简介
Socket简称套接字,用于实现网络上客户和服务器之间的连接。也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。
Java通过socket来完成它所有的网络底层的通讯,socket是一种通讯的通道,
3
天津科技大学2011届本科生毕业设计
通过它可以将数据通过特定的端中发送及接收。Java中的socket可以分成二大类:Datagram Sockets(数据包socket)和 Stream Sockets(流socket)。Stream Socket有一个永久性的链接,可以确保数据可靠的发送到对方。但是Stream Socket所占的资源更多。Java主要通过Socket及ServerSocket来实现Stream Socket,一个用于客户端,另一个用户服务器端。
具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服务器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个Socket建立连接,客户端通过写Socket来通知服务器,以读Socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个Socket,通过读写和客户端通信[8]。
客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
上面的方法基本可以建立一条连线让两台计算机相互交流了。数据则是通过I/O流进行传输。因为底层的网络是继续数据的。除非远程调用,处理问题的核心在执行上。 所以你也必须导入Java.io这个包。Java的IO操作也不复杂。它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出。服务器可以不断接收客户机所写入的信息只到。客户机发送\字符串就退出程序。并且服务器也会做出\为回应。
Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上\建立一个Socket\意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。 两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。
一、Socket程序的工作过程:
1.建立Socket连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接道。
2.数据通信:利用虚拟连接通道传送数据信息进行通信。 3.关闭:通信结束时,再将所建的虚拟连接拆除。 具体如下:
4
天津科技大学2011届本科生毕业设计
1服务器serversocket 2监听 3客户端socket 4.连接 5读 6写 6读 5写 7关闭 7关闭 图2-1 Socket程序的工作过程
二、三次握手协议:
第一次握手:原主机发送一个带有本次连接的序号的请求的一个数据帧 第二次握手:目的主机收到请求后,如果同意连接,则发回一个带有一个本次连接序号和源端机连接序列号的确认。
第三此握手:源端机收到含有两次初始序列号的应答后,再向目的主机发送一个带有两次连接的序列号的确认。
具体过程如下:
图2-2三次握手协议
5
天津科技大学2011届本科生毕业设计
第四节 Swing的简介
AWT是Swing的基础。Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。
AWT设计的初衷是支持开发小应用程序的简单用户界面。例如AWT缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜单或滚动窗格等基本元素。
随着发展的需要,Swing出现了,Swing组件几乎都是轻量组件,与重量组件相比,没有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。
Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级(light -weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。
Swing采用了一种MVC的设计范式,即“模型-视图-控制”(Model-View- Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。
Swing外观感觉采用可插入的外观感觉(Pluggable Look and Feel,PL&F)。 在AWT组件中,由于控制组件外观的对等类与具体平台相关,使得AWT组件总是只有与本机相关的外观。Swing使得程序在一个平台上运行时能够有不同的外观。用户可以选择自己习惯的外观。 一、框架、监听器和事件:
框架 (Frame, JFrame) 是 Java 图形用户界面的基础,它就是我们通常所说的窗口,是 Windows/XWindow 应用程序的典型特征。说到 Windows/XWindow,大家很容易联想到“事件 (Event) 驱动”。Java 的图形用户界面正是事件驱动的,并且由各种各样的监听器 (Listener) 负责捕捉各种事件。
如果我们需要对某一个组件的某种事件进行捕捉和处理时,就需要为其添加监听器。比如,我们要在一个窗口 (JFrame) 激活时改变它的标题,我们就需要为这个窗口 (JFrame 对象) 添加一个可以监听到“激活窗口”这一事件的监听器——WindowListener。添加监听器通常由组件类提供的一个 addXxxxxListener 的方法来完成。比如 JFrame 就提供有 addWindowListener 方法添加窗口监听器 (WindowListener)。
二、按钮、切换按钮、复选按钮和单选按钮
切换按钮,有两种状态的按钮,即按下状态和弹起状态,若称为选择状态或
6
天津科技大学2011届本科生毕业设计
未选择状态。
复选按钮,又叫复选框,用一个小方框中是否打勾来表示两种状态。 单选按钮,又叫收音机按钮,以小圆框打点表示被选中。常成组出现,一组单选按钮中只有一个能被选中。
除一般按钮外,其余三种按钮都有两种状态,即选择 (按下) 状态和未选择 (弹起) 状态。那么我们又该如何判断呢?切换按钮 (JToggleButton) 提供了一个 isSelected() 方法用来判断当前所处的状态,返回值为真 (true) 时表示它处于选择状态,返回值为假 (false) 时表示它处于未选择状态。而复选按钮 (JCheckBox) 和单选按钮 (JRadioButton) 都是从 JToggleButton 继承的,所以也具有 isSelected() 方法。
三、文本输入框、密码输入框
文本输入框包括两种,单行文本输入框 (JTextField) 和多行文本输入框 (JTextArea)。密码输入框则只有一种 (JPasswordField)。JPasswordField 是 JTextField 的子类,它们的主要区别是 JPasswordField 不会显示出用户输入的东西,而只会显示出程序员设定的一个固定字符,比如 '*' 或者 '#'。 四、窗格、滚动窗格和布局管理
窗格 (JPanel) 和滚动窗格 (JScrollPane) 在图形用户界面设计中大量用于各种组件在窗口上的布置和安排。这里所谓的布置和安排,就是布局 (Layout)。
将加入到容器(通常为窗口等) 的组件按照一定的顺序和规则放置,使之看起来更美观,这就是布局。布局由布局管理器 (Layout Manager) 来管理。
我们设计一个窗口,其中是要添加若干组件的。为了管理好这些管理的布局,我们就要使用布局管理器。比如说,设计一个简单的编辑器,这个编辑器中只需要放置两个按钮和一个多行文本框。这些组件是是按照一定的位置关系较规范的安排的。那么,为了按照一定的位置关系安排这些组件,需要用到布局管理器了。 常用的布局管理器有: FlowLayout、BorderLayout、GridLayout、BoxLayout 等,其中 FlowLayout 和 BorderLayout 最常用。
第五节 C/S结构
C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应
7
天津科技大学2011届本科生毕业设计
用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。
Client/Server或客户/服务器模式:Client和Server常常分别处在相距很远的两台计算机上,Client程序的任务是将用户的要求提交给Server程序,再将Server程序返回的结果以特定的形式显示给用户;Server程序的任务是接收客户程序提出的服务请求,进行相应的处理,再将结果返回给客户程序。 一、C/S工作模式
C/S 结构的基本原则是将计算机应用任务分解成多个子任务,由多台计算机分工完成,即采用“功能分布”原则。客户端完成数据处理,数据表示以及用户接口功能;服务器端完成DBMS的核心功能。这种客户请求服务、服务器提供服务的处理方式是一种新型的计算机应用模式。 二、C/S结构的优点
C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。缺点主要有以下几个: 只适用于局域网。而随着互联网的飞速发展,移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据。
客户端需要安装专用的客户端软件。首先涉及到安装的工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护。特别是有很多分部或专卖店的情况,不是工作量的问题,而是路程的问题。还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。
8
天津科技大学2011届本科生毕业设计
第三章 系统分析与设计方案
第一节 开发环境及工具
本系统所用的工具:
服务器端:(Windows平台)首先应有Java环境jdk,建议采用jdk1.4.2;Eclipse。 客户端: Java环境jdk,建议jdk1.42;Eclipse。 本系统运行所需用到的环境为: 硬件配置 :
中央处理器(CPU) :P4 2.0G以上的处理器; 硬 盘:40GB以上硬盘; 内 存:256以上的DDR内存; 显 卡:128M以上显存显卡
软件配置:WINDOWS XP 版本、All-In-One-Eclipse-311、j2sdk-1.42等。
第二节 聊天系统的总体设计要点
一、实现思想
在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
服务器端工作流程:
服务器端通过系统调用创建一个ServerSocket与指定的本地端口绑定,就可以在端口进行侦听。如果有客户端连接请求,则创建一个Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。
客户端工作流程:
客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。 二、系统功能流图:
9
天津科技大学2011届本科生毕业设计
启动AppServer.java 启动ChatClient.java 登录 是否注册 服务器serversocket 是 否 注册 监听 客户端socket 建立与客户端连接的套接字 1.读客户端信息 2.向客户端转发信息 1.读服务端信息 2.向服务器写信息 关闭服务器 关闭客户端
图3-1 系统功能流图
功能流说明如下:
1.启动服务器程序,服务器端创建一个ServerSocket对象,指定端口号。 2.ServerSocket对象等候客户端的连接请求。
3.启动客户端程序,登录用户。如果未注册,先注册再登录。登录成功进入聊天室用户界面。
4.客户端创建一个Socket对象,指定主机地址和端口号,向服务器发送连接请求。
5.服务器端收到客户端请求,建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信。
6.服务器端和客户端分别建立字节输入/输出流,进行数据传输准备。 7.服务器端和客户端通过各自的字节输入流获得对方发送过来的数据,通过字节输出向对方发送数据。
8.一方决定结束通信,向对方发送结束信息,另一方收到结束信息后,双方分别关闭各自的TCP连接。
9.对象停止等候客户端连接请求。 三、多用户实时工作原理图
10
天津科技大学2011届本科生毕业设计
图3-2 多用户实时工作原理图
注:服务器的run()方法中采用了while(true)结构,不断监听客户端的请求,如收到请求,建立与当前请求的客户端连接的套接字,从而与客户端建立联系。
第三节 系统的功能模块划分及设计原理
当用户聊天时,将当前用户名、聊天对象、聊天内容和是否私聊进行封装并且序列化,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是1秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为1秒最佳,因为每个用户都不可能在1秒内连续发送信息。当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化显示在聊天信息界面上。 一、服务器程序模块(AppServer.Java)
服务器与客户间通过套接口Socket(TCP)连接。在Java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类Java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8000,然后无限循环调用accept()方法接受客户程序的连接。
11
天津科技大学2011届本科生毕业设计
服务器具有以下功能:
1.启动服务,建立侦听,接受客户端连接。 2.从流中读取经过序列化的对象。
3.分析读取的对象进行相应的操作(登录信息的验证反馈、注册信息的验证和反馈、转发聊天信息等)
4.向客户端发送系统消息。 5.保存日志
6.关闭服务,并向客户端发送服务器关闭消息。
服务器程序模块源码:
private ServerSocket serverSocket; private ServerFrame sFrame;
private static Vector userOnline = new Vector(1, 1); private static Vector v = new Vector(1, 1); //创建服务器 启动服务监听1001端口 public AppServer() {
sFrame = new ServerFrame(); try { serverSocket = new ServerSocket(1001); // 获取服务器的主机名和IP地址 InetAddress address = InetAddress.getLocalHost(); sFrame.txtServerName.setText(address.getHostName()); sFrame.txtIP.setText(address.getHostAddress()); sFrame.txtPort.setText(\ } catch (IOException e)
{
fail(e, \不能启动服务!\}
sFrame.txtStatus.setText(\已启动...\ this.start(); // 启动线程 }
public static void fail(Exception e, String str)
{
System.out.println(str + \。\ } /**
* 监听客户的请求,当有用户请求时创建 Connection线程 */
public void run() { try { while (true)
12
天津科技大学2011届本科生毕业设计
} /**
* 启动服务器 */
public static void main(String args[]) {
new AppServer(); } }
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 二、登录程序模块(Login.Java)
是客户端程序登录界面,负责用户帐号信息的验证与接收服务器的反馈。客户端请求连接,服务器的accept()方法建立与客户端的套接字连接。客户端将登录信息封装成Customer对象通过输出流发送服务器,等待服务器的验证,服务器反馈验证信息,客户端根据反馈信息进行登录和登录信息错误处理。
关键代码如下:
public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource(); if (source.equals(btnLogin)) {
// 判断用户名和密码是否为空
if (txtUserName.getText().equals(\
{
JOptionPane op1 = new JOptionPane();
op1.showMessageDialog(null, \用户名或密码不能为空\ } else
{
strServerIp = txtServer.getText();
login(); }
13
{
// 监听并接受客户的请求 Socket client = serverSocket.accept(); new Connection(sFrame, client, userOnline, v); // 支持多线程 }
} catch (IOException e)
{ fail(e, \不能监听!\ }
天津科技大学2011届本科生毕业设计
}
if (source.equals(btnRegister)) {
strServerIp = txtServer.getText(); this.dispose();
new Register(strServerIp); }
if (source == btnExit) {
System.exit(0); }
} // actionPerformed()结束 public void login() {
// 接受客户的详细资料
Customer data = new Customer();
data.custName = txtUserName.getText(); data.custPassword = pwdPassword.getText(); try { // 连接到服务器 Socket toServer; toServer = new Socket(strServerIp, 1001); ObjectOutputStream treamToServer= new ObjectOutputStream(toServer .getOutputStream()); // 写客户详细资料到服务器socket streamToServer.writeObject((Customer) data); // 读来自服务器socket的登录状态 BufferedReader fromServer = new BufferedReader( new InputStreamReader(toServer.getInputStream())); String status = fromServer.readLine(); if (status.equals(\登录成功\
{
new ChatRoom((String) data.custName, strServerIp); this.dispose(); // 关闭流对象 streamToServer.close(); fromServer.close(); toServer.close(); } else
{
JOptionPane.showMessageDialog(null, status); // 关闭流对象 streamToServer.close(); fromServer.close();
14
天津科技大学2011届本科生毕业设计
toServer.close(); } } catch (ConnectException e1) { JOptionPane.showMessageDialog(null, \未能建立到指定服务器的连接!\
} catch (InvalidClassException e2) { JOptionPane.showMessageDialog(null, \类错误!\ } catch (NotSerializableException e3) { JOptionPane.showMessageDialog(null, \对象未序列化!\ } catch (IOException e4) { JOptionPane.showMessageDialog(null, \不能写入到指定服务器!\
} } // login()结束
/**
* 启动登陆窗体 * @param args */
public static void main(String args[])
{ new Login();
}
三、注册程序模块(Register.Java)
为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。注册模块的原理跟登录模块基本相同。注册信息封装成Register_Customer对象,但服务器只验证用户名,且只要求用户名不重复,服务器检验注册信息文件中的用户名,若不重复则反馈注册成功的信息。其他的注册信息(密码、年龄、邮箱)合法性都交给注册模块自己完成。
关键代码如下:
public void actionPerformed(ActionEvent ae) {
Object source=new Object(); source=ae.getSource();
if (source.equals(btnOk)) //\确定\按钮
{
register(); }
if (source.equals(btnCancel)) //\返回\按钮 {
new Login(); this.dispose(); }
15
天津科技大学2011届本科生毕业设计
if (source.equals(btnClear)) //\清空\按钮 {
txtUserName.setText(\
pwdUserPassword.setText(\ pwdConfirmPass.setText(\ txtAge.setText(\ txtEmail.setText(\ }
} //actionPerformed()结束 public void register() { //接受客户的详细资料
Register_Customer data=new Register_Customer(); data.custName = txtUserName.getText(); data.custPassword = pwdUserPassword.getText(); data.age = txtAge.getText(); data.sex = rbtnMale.isSelected()?\男\女\ data.email = txtEmail.getText(); data.head = comboBox.getSelectedItem().toString(); //验证用户名是否为空 if(data.custName.length()==0) { JOptionPane.showMessageDialog(null,\用户名不能为空\ return; } //验证密码是否为空 if(data.custPassword.length()==0) { JOptionPane.showMessageDialog(null,\密码不能为空\ return; } //验证密码的一致性 if(!data.custPassword.equals(pwdConfirmPass.getText())) { JOptionPane.showMessageDialog(null,\密码两次输入不一致,请重新输入\
return; } //验证年龄是否为空 if(data.age.length()==0) { JOptionPane.showMessageDialog(null,\年龄不能为空\ return; }
16
天津科技大学2011届本科生毕业设计
//验证年龄的合法性
int age=Integer.parseInt(txtAge.getText()); if (age<=0||age>100)
{
JOptionPane.showMessageDialog(null,\年龄输入不合法\ return; } //验证Email的正确性 int Found_flag=0; //判断标志 for (int i=0;i return; } try { //连接到服务器 Socket toServer; toServer = new Socket(strServerIp,1001); ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream()); //写客户详细资料到服务器socket streamToServer.writeObject((Register_Customer)data); //读来自服务器socket的登陆状态 BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer.getInputStream())); String status=fromServer.readLine(); //显示成功消息 JOptionPane op=new JOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+\注册成功\ { txtUserName.setText(\ pwdUserPassword.setText(\ pwdConfirmPass.setText(\ txtAge.setText(\ 17 天津科技大学2011届本科生毕业设计 txtEmail.setText(\ } //关闭流对象 streamToServer.close(); fromServer.close(); } catch(InvalidClassException e1) { JOptionPane.showMessageDialog(null,\类错误!\ } catch(NotSerializableException e2) { JOptionPane.showMessageDialog(null,\对象未序列化!\ } catch(IOException e3) { JOptionPane.showMessageDialog(null,\不能写入到指定服务器!\ } } //方法register()结束 public static void main(String args[]) { new Register(\ } 四、客户聊天主程序模块(ChatRoom.Java) 客户通过Socket(InetAddress,port)建立与服务器的连接。客户端通过构造ObjectInputstream,ObjectOutputstream与服务器建立输入输出流,然后双方通过该输入输出流来相互传递信息,服务器一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端接受服务器传来的聊天信息进行处理后显示在自己的聊天纪录中。同样客户端要发送文件和信息时也向服务器发送请求,服务器同样通过accept()方法返回一个Socket对象,客户端就可也进行相应的操作。 聊天客户端必须具有以下功能。 1.连接服务器,发送用户登陆请求。 2.向服务器发送聊天信息。 3.接收服务器转发的了信息。 4.接受服务器发送的系统消息。 关键源码如下: public void run() { int intMessageCounter = 0; int intUserTotal = 0; boolean isFirstLogin = true; // 判断是否刚登陆 18 天津科技大学2011届本科生毕业设计 boolean isFound; // 判断是否找到用户 Vector user_exit = new Vector(); try { // Socket toServer; // toServer = new Socket(strServerIp, 1001); for (;;) { Socket toServer; toServer = new Socket(strServerIp, 1001); // 将信息发往服务器 ObjectInputStream streamfromserver = new ObjectInputStream( toServer.getOutputStream()); // 收来自服务器的信息 ObjectInputStream streamfromserver = new ObjectInputStream( toServer.getInputStream()); messobj = (Message) streamfromserver.readObject(); // //////刷新聊天信息列表////////// if (isFirstLogin) // 如果刚登陆 { intMessageCounter = messobj.chat.size(); // 屏蔽该用户登陆前的聊天内容 isFirstLogin = false; } if (strLoginName.equals(messobj.ti)) { // taUserMessage.append(\ exitChatRoom(); JOptionPane.showMessageDialog(null, strLoginName + \你被管理员剔除!\ } if (!serverMessage.equals(messobj.serverMessage)) { serverMessage = messobj.serverMessage; taUserMessage.append(\系统消息]:\ } // taUserMessage.setText(\ for (int i = intMessageCounter; i < messobj.chat.size(); i++) { Chat temp = (Chat) messobj.chat.elementAt(i); String emote = temp.emote; if (emote.equals(\表情\ emote = \ } else { emote += \地\ 19 天津科技大学2011届本科生毕业设计 } String temp_message; if (temp.chatUser.equals(strLoginName)) { if (temp.chatToUser.equals(strLoginName)) { temp_message = \系统提示您:请不要自言自语!\ } else { if (!temp.whisper) // 不是悄悄话 { temp_message = \【你】对【\】\ + emote + \说:\ } else { temp_message = \【你】悄悄对【\ + \】\说:\ } } } else { if (temp.chatToUser.equals(strLoginName)) { if (!temp.whisper) // 不是悄悄话 { temp_message = \【\】对【你】\ + emote + \说:\ } else { temp_message = \【\】悄悄对【你】\ + emote + \说:\ } } else { if (!temp.chatUser.equals(temp.chatToUser)) // 对方没有自言自语 { if (!temp.whisper) // 不是悄悄话 { temp_message = \【\】对【\ + temp.chatToUser + \】\ + \说:\ } else { temp_message = \ } } else { emp_message = \ } } 20 天津科技大学2011届本科生毕业设计 } taUserMessage.append(temp_message); intMessageCounter++; } // 显示用户进入聊天室的信息 if (messobj.userOnLine.size() > intUserTotal) { // chenmin String tempstr = ((Customer) messobj.userOnLine .elementAt(messobj.userOnLine.size() - 1)).custName; // String tempstr = messobj.userOnLine.elementAt( // messobj.userOnLine.size() - 1).toString(); if (!tempstr.equals(strLoginName)) { taUserMessage.append(\【\】来了\ } } // 显示用户离开聊天室的信息 // 显示用户离开聊天室的信息 if (messobj.userOnLine.size() < intUserTotal) { for (int b = 0; b < user_exit.size(); b++) { isFound = false; for (int c = 0; c < messobj.userOnLine.size(); c++) { String tempstr = ((Customer) user_exit.elementAt(b)).custName; if (tempstr.equals(((Customer) messobj.userOnLine .elementAt(c)).custName)) { isFound = true; break; } } if (!isFound) // 没有发现该用户 { String tempstr = ((Customer) user_exit.elementAt(b)).custName; if (!tempstr.equals(strLoginName)) { taUserMessage.append(\【\】走了\ } } } } user_exit = messobj.userOnLine; intUserTotal = messobj.userOnLine.size(); 21 天津科技大学2011届本科生毕业设计 streamtoserver.close(); streamfromserver.close(); toServer.close(); Thread.sleep(3000); } } catch (Exception e) { @SuppressWarnings(\ JOptionPane jop = new JOptionPane(); JOptionPane.showMessageDialog(null, \不能连接服务器!\ e.printStackTrace(); frmChat.dispose(); // System.out.println(); // System.out.println(e.getMessage()); } } // run()结束 五、时钟显示程序模块 (Clock.java) 通过创建Clock()函数,设置时钟格式。并通过窗体来添加事件监听,从而得到触发。 关键源码如下: public Clock() { super(\时钟\ setSize(300,300); setBackground(new Color(0,0,192)); setResizable(false); Dimension scr=Toolkit.getDefaultToolkit().getScreenSize(); //在屏幕居中显示 Dimension fra=this.getSize(); if(fra.width>scr.width) { fra.width=scr.width; } if(fra.height>scr.height) { fra.height=scr.height; } this.setLocation((scr.width-fra.width)/2,(scr.height-fra.height)/2); show(); int delay = 1000; //窗体添加事件监听,监听秒表的触发 ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) 22 天津科技大学2011届本科生毕业设计 { repaint(); } }; new Timer(delay, taskPerformer).start(); } public void actionPerformed(ActionEvent e) { timer.restart(); } public void paint( Graphics g ) { Insets insets = getInsets(); int L0 = (insets.left)/2, T0 = (insets.top)/2; int hh,mm,ss; String st; h=getSize().height; //绘制圆形 g.setColor(Color.white); g.drawOval(L0+30,T0+30,h-60,h-60); g.drawOval(L0+32,T0+32,h-64,h-64); r=h/2-30; x0=30+r-5+L0; y0=30+r-5-T0; ang=60; for (int i=1; i<=12; i++) { x=(int)((r+10)*Math.cos(RAD*ang)+x0); y=(int)((r+10)*Math.sin(RAD*ang)+y0); g.drawString(\ ang-=30; } x0=30+r+L0; y0=30+r+T0; //获取时间 Calendar now=Calendar.getInstance(); hh=now.get(Calendar.HOUR_OF_DAY);//小时 mm=now.get(Calendar.MINUTE);//分钟 ss=now.get(Calendar.SECOND);// 秒 g.setColor(Color.pink); g.fillRect(L0,T0,60,28);//填充的矩形 g.setColor(Color.blue); if (hh < 10) st=\ if (mm < 10) st=st+\ if (ss < 10) st=st+\ 23 天津科技大学2011届本科生毕业设计 g.drawString(st,L0,T0+25); //计算时间和图形的关系 sdo=90-ss*6; mdo=90-mm*6; hdo=90-hh*30-mm/2; //擦除秒针 if (old_X > 0) { g.setColor(getBackground()); g.drawLine(x0,y0,old_X,(h-old_Y)); } else { old_M=mdo; old_H=hdo; } //绘制秒针 g.setColor(Color.yellow); x=(int)((r-8)*Math.cos(RAD*sdo)+x0); y=(int)((r-8)*Math.sin(RAD*sdo)+y0)-2*T0; g.drawLine(x0,y0,x,(h-y)); old_X=x; old_Y=y; //擦除分针和时针 if (mdo != old_M) { line(g,old_M,(int)(r*0.7),getBackground()); old_M=mdo; } if (hdo != old_H) { line(g,old_H,(int)(r*0.5),getBackground()); old_H=hdo; } //绘制分针 line(g,mdo,(int)(r*0.7),Color.green); //绘制时针 line(g,hdo,(int)(r*0.5),Color.red); } // end paint public void line(Graphics g, int t, int n, Color c) { int [] xp = new int[4]; int [] yp = new int[4]; xp[0]=x0; yp[0]=y0; 24 天津科技大学2011届本科生毕业设计 xp[1]= (int)((n-10)*Math.cos(RAD*(t-4))+x0); yp[1]=h-(int)((n-10)*Math.sin(RAD*(t-4))+y0); xp[2]= (int)( n *Math.cos(RAD* t )+x0); yp[2]=h-(int)( n *Math.sin(RAD* t )+y0); xp[3]= (int)((n-10)*Math.cos(RAD*(t+4))+x0); yp[3]=h-(int)((n-10)*Math.sin(RAD*(t+4))+y0); g.setColor(c); g.fillPolygon(xp,yp,4); } public static void main(String args[]) { new Clock(); } } 25 天津科技大学2011届本科生毕业设计 第四章 系统实现与最终效果 第一节 系统工作的过程 本系统的编译环境,及编写平台为Java。主要用到的类为Java.net包中的Socket类。编写了多个图形界面,包括服务器界面,客户端聊天界面,登录界面,注册界面,音乐播放器界面等。 以服务器所在的主机的ip为“127.0.0.1”所侦听的端口号为“8000”。分别先后启动服务器和客户端应用程序,客户端用户填入登录信息,当服务器收到客户端的登录请求后,若验证登录信息正确,则向客户端发送一个反馈一个登录成功的消息,客户端和服务器通过套接字建立了联系。建立连接后双方就可以相互通信:客户端在自己的文本框输入要发送的信息点击发送后,发送的信息就会显示在服务器和目的客户端的文本域中,同样服务器也可以在自己的文本框输入系统信息,点击发送信息按钮后,发送的信息就会显示在服务器和客户端的文本域中。 第二节 使用方法 一、服务器端:运行服务器程序 二、客户端: 1.进入登陆界面,第一次登陆需要注册,点注册按扭。 2.按要求填完注册信息。 3.返回登陆窗口,输入用户名、密码,进行登陆。 4.进入聊天室。 进入聊天室后,就可以尽情的聊天了,可以和你喜欢的人私聊了,聊的开心话题还可以进行保存,当然,你也可以清屏。 第三节 各功能模块运行效果 一、服务器 服务器界面左边是状态面板,包括服务器当前的状态、在线人数、最多在线人数(一个端口默认的最多访问量)、服务器的IP(这里我设计的是一个回路测试,只是为了测试的方便,不影响它的网络功能)以及服务器的端口号(由服务器指定);接下了的文本框是用户日志用于显示用户的登录、注册、退出的时间等一系列的信息。日志可以保存,这也是服务器应该有的最基本的功能。中间是在线用户列表,在上面显示了当前所有的在线用户,列表可滚动,方便查看;最 26 天津科技大学2011届本科生毕业设计 右边是聊天消息总汇,用于显示所有用户的对话记录,当文本域中的内容大于文本域的长和宽的时候,文本域自动出现水平滚动条或垂直滚动条,拖动它们来查看所有的内容,主要功能是能监察聊天内容的合法性,如果聊天内容非法服务器可以向用户发出警告的系统信息;下面为一个文本框,主要是用于服务器向客户端发送信息,既可是中文,也可是字母;最下一排是控制按钮,“发送信息” 点击后将文本框中的内容发送给客户端,同时清空文本框中的内容,并且在服务器端的文本域显示“系统消息:”;“关闭服务器”点击后关闭服务器。 图4-1 服务器 二、登录 这里将服务器的IP设置为默认的,127.0.0.1回路测试,不可编辑。所以这一项可以跳过不填。用户名和密码输入为注册成功的用户,单击登录按钮进入聊天室。如果用户名和密码错误可以弹出相应的对话框。单击注册按钮进入注册界面,这个操作一般提供给新用户。 27 天津科技大学2011届本科生毕业设计 图4-2 登录界面 图4-3 登录成功页面 三、注册 注册界面为新用户提供了注册信息输入的界面。界面如下,用户名没有限制,中文、英文符号都可以;密码只要保证两次输入的一致;性别默认为“男”可以通过单选框进行选择;年龄必须是0—100之间的数字,在这个范围之外为非法;电子邮箱只提供的对“@”检查,输入的电子邮件中必须有且只有一个 “@”,否则为非法;系统提供了头像选择的功能,可以选择自己喜欢的头像。 28 天津科技大学2011届本科生毕业设计 图4-4 注册界面 四、客户端主聊天界面 客户端聊天用户端界面如下:最左边是用户列表,显示了聊天室的在线用户列表;在线用户列表下边的标签可以显示在线人数,极大的方便了用户;右边的大的文本框显示出聊天纪录,用户可以在这看到其他成员发给自己的聊天信息,也是聊天室的关键部分之一。 下边的单行文本框输入用户预发送的内容,这时你可以通过双击在线用户列表框选择聊天的对象,再通过单击单选框选择聊天的方式,也可发送表情,上述步骤都完成后就单击发送按钮发送聊天信息。在最下边附加功能面板上,还有时钟,单击之后将显示当前时间以及清屏、保存聊天内容、退出等选项。 图4-5 聊天用户端界面 29 天津科技大学2011届本科生毕业设计 图4-6 悄悄话聊天界面 五、时钟 单击聊天用户端界面中的时钟,可现实当前时间。 图4-7 时钟 六、服务器用户信息管理界面 该界面是可以对用户进行管理,可以踢除用户,使得该用户不可以使用该聊天系统。如果用户被踢除之后想继续使用聊天系统,则他需重新进行登录。 30 天津科技大学2011届本科生毕业设计 图4-8 服务器用户信息管理界面 七、服务器广播 该功能是将管理员的想对用户说的话进行广播。 图4-9 服务器对用户进行广播界面 31 天津科技大学2011届本科生毕业设计 八、系统总效果图 下图为系统回路测试的总的效果图,包括服务器和三个用户某个时刻的情况,用户之间有私聊和公聊,服务器发布了系统信息。总之聊天室的最基本功能很好的体现出来了。 图4-10 聊天室总的效果图 第四节 功能模块测试 对软件的测试在软件开发中非常重要也非常必要,软件分析、设计过程中难免有各种各样的错误,需要通过测试查找错误,以对软件进行修改和进一步完善。软件测试的目标是为了发现程序中的错误而执行程序的过程,好的测试方案是发现软件尽可能多的错误,从而对错误进行修改以提高软件质量。 测试本系统采用黑盒测试法:主要测试软件能否满足功能要求,检查输入能否被正确地接受、能否正确地输出结果。 测试步骤: 用户登录测试: 输入用户名(js)和密码(2),系统提示用户密码错误,重新输入密码(1),成功进入系统。 用户注册测试: 输入邮箱(asdfgl163.com),系统提示邮箱输入非法,重新输入(asdfghj@163.com),成功注册。 32 天津科技大学2011届本科生毕业设计 第五章 总 结 第一节 毕业设计总结和展望 本毕业设计实现了简单的实时聊天功能,经过细心的调试和排错解决了绝大部分的问题。根据实现的情况看,具有较友好的聊天界面生成效果,以及流畅的网络通信效果。基本满足了结构化、界面友好、速度快、安全性以及稳定性等特点。系统具有目前聊天室的基本功能:包括支持多种头像,支持私聊,支持在线聊友显示。 由于时间短,任务重,加上本人能力有限,许多设想还未能体现,如语音、视频聊天等等,在今后工作之余,本人会尽力付之实践,使其尽善尽美。 第二节 经验和感想 基本Java聊天室开发与实现作为毕业设计,是本人目前做过的最大的程序。虽然大学期间在设计过一个简单的ASP聊天室设计,并且经过反复的调试修改也达到了一定的精确性,但接手这个题目时仍感觉十分棘手以前并且习惯于C++,对Java的是学习与使用很少,决定用Java 来做这个毕业设计,对我来说是一个很大的挑战。 在学校学习期间做过很多课程设计,大多规模很小,跟实际应用还存在很大的差距,一直都想亲手设计一个比较大的系统能够基本拿出来使用。并且对程序开发也很感兴趣,只是以前技术和时间都有限,一直都没有实现。现在有机会了,当看到自己的程序经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情,正式商业的软件的人性化界面和各个游戏间差异的结构会让人有去开发的冲动。平时自己也常到其它聊天室进行聊天,因此,自己也曾想过以后有机会了一定亲自设计一款聊天系统,如今,总算实现了自己的梦想。基于Java聊天系统设计与实现毕业设计正是建立在Java平台上,是本人以前未曾接触过的领域。凭着探索新知识的热情,我选择了该设计题目。 学习该平台背景和功能的时间远远超出了我想象的时间。在设计初期,为了画出一个简单的图形,都需要花一定的时间去掌握和熟悉。聊天室主要是要处理好多线程的问题,大多数的参考资料都只提供单线程的处理,在这方面我动了一番脑筋,在线程之中再创建同等线程,从而实现了多线程。后来在做音乐播放器模块时又碰到了怎样终止线程的问题,我就得广泛去找资料,但J2ME为一种刚出现仅几年的新技术,国内的参考资料非常少,仅有的几本也停留在简单的介绍 33 天津科技大学2011届本科生毕业设计 阶段。台湾的王森写了两本较好的书,给了我很大的帮助,但对设计该聊天系统来说,仍只够入门。在发觉中文资料的稀少后,我不得不将各个资料进行整合,提炼出自己需要的,并进行了大量的试验,把自己的想法编出来,一遍一遍的进行调试,最终得到自己想要的效果。在学习期间,本人还通过网上的各种Java源码进行学习与研究,我原以为这样的设计水平将无法完成毕业设计,但当掌握了大部分应用技巧时,剩下的聊天系统思路的设计就显得不是最大的障碍了。指导老师说Java的上手比较困难,需要配置的环境和掌握的背景比较多。现在看来的确是这样。 我花了几个月写完这个程序,经过了很多次的调试,终于达到了现在的效果。原先认为不可能的事,我发现,如果有不畏困难的信心和肯钻研的勇气,就一定会完成,甚至达到意想不到的效果。并且加深了对Java的理解,我相信自己的Java编程水平提高了很多。 34 参考文献 [1] Bruce Eckel.Java编程思想[M].北京:电子工业出版社,2006. [2] Cay S Horstmann,Gary Cornell.Java2核心技术[M].北京:机械工业出版社,2006. [3] 陈刚.Eclipse从入门到精通[M].北京:清华大学出版社,2005. [4] 王森.快易通Java程序设计[M].北京:北京大学出版社,2000. [5] 叶至军.由浅入深——Java2自学手册[M].北京:人民邮电出版社,2004. [6] 王森.Java语言程序设计[M].北京:清华大学出版社,2005. [7] Art Taylor,Randy Layman,Brian Buege.J2EE Java黑客大曝光:开发安全的Java应用程序北京:清华大学出版社,2003. [8] 杨丽娜.电子商务环境中J2EE的关键技术及其应用研究[D].武汉:武汉理工大学,2005. [9] 宛延闿.Java编程技巧[M].北京:机械工业出版社,2005. [10] 钟珞,刘玲,夏红霞.基于JavaMail API的Web邮件系统开发[D].武汉:武汉理工大学计算机科学与技术学院 , 2006. [11] 徐剑军,徐鹏.Java嵌入技术[M].北京:清华大学出版社,1998. [12] Jan Newmarch.Jini技术开发指南[M].北京:中国电力出版社,2003. [13] Paul B Monday.FMA和Jiro入门[J/OL].http://www.ibm.com. [14] SUN.Java API中文文档[J/OL].http://Java.sun.com. [15] Ncic.用Java实现网络语音信号传送[J/OL].http://wt.3800hk.com/index.html. 致 谢 紧张而忙碌的毕业设计就要结束了,在完成了系统的功能设计后,我感到由衷的喜悦和自豪。在我做毕业设计期间,许多老师,同学和朋友给我我无私的关怀和帮助,在此,我要向他们表示衷心的感谢。最重要的是要感谢柳老师及时的督促,技术上的帮助以及许多建设性的指导。 这次的毕业设计让我受益匪浅。在理论课的学习中,我掌握了基础课和专业课的理论知识,也曾经做过一些程序设计的联系和计算机综合试验,但真正动手设计一个实用软件,还是第一次。在这次的毕业设计中,我曾遇到了许多困难,而在克服这些困难的过程中,我的各方面的能力又有了很大的提高,使我的理论知识更好的与实践相结合,增强了专业技能的可实践性。从调研,需求分析到查找资料,结构设计,详细设计以及调试程序,到最后的写使用说明书,我终于设计出了一个比较完整的,周密的,可使用的聊天系统。通过这次的毕业设计,我真正了解了软件工程设计的整个过程,既巩固了以前的理论知识,也为我以后的工作奠定了良好的基础。 当然,由于时间的短促,我所完成的系统并不是尽善尽美的,还有待进一步的修改和完善。最后,请允许我再一次向毕业期间无私帮助过我的老师,同学和朋友表示最衷心的感谢。 致 谢 紧张而忙碌的毕业设计就要结束了,在完成了系统的功能设计后,我感到由衷的喜悦和自豪。在我做毕业设计期间,许多老师,同学和朋友给我我无私的关怀和帮助,在此,我要向他们表示衷心的感谢。最重要的是要感谢柳老师及时的督促,技术上的帮助以及许多建设性的指导。 这次的毕业设计让我受益匪浅。在理论课的学习中,我掌握了基础课和专业课的理论知识,也曾经做过一些程序设计的联系和计算机综合试验,但真正动手设计一个实用软件,还是第一次。在这次的毕业设计中,我曾遇到了许多困难,而在克服这些困难的过程中,我的各方面的能力又有了很大的提高,使我的理论知识更好的与实践相结合,增强了专业技能的可实践性。从调研,需求分析到查找资料,结构设计,详细设计以及调试程序,到最后的写使用说明书,我终于设计出了一个比较完整的,周密的,可使用的聊天系统。通过这次的毕业设计,我真正了解了软件工程设计的整个过程,既巩固了以前的理论知识,也为我以后的工作奠定了良好的基础。 当然,由于时间的短促,我所完成的系统并不是尽善尽美的,还有待进一步的修改和完善。最后,请允许我再一次向毕业期间无私帮助过我的老师,同学和朋友表示最衷心的感谢。
正在阅读:
基于Java的聊天室程序设计 - 图文03-29
2009年度混凝土与水泥制品行业经济运行情况与分析04-23
一匹狼的真情告白作文500字07-08
护士职责08-28
李亚鹏写给王菲的信内容原文02-13
黄石市城市色彩规划控制导则09-16
超市有关的潜规则02-22
师恩难忘手抄报图片欣赏02-16
基于地磁传感器的车辆检测算法_荣梅06-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 程序设计
- 聊天室
- 基于
- 图文
- Java
- 新编2012年会计从业资格考试应试模拟试卷-会计电算化理论(2012
- 闵行区财政预算项目支出绩效(后)评价实施细则 闵财行68
- 贵州省绥阳县农场式养生养老院可行性研究报告 - 图文
- 2016体育单招政治练习卷
- STK中的姿态设置与应用 - 图文
- 一句话SAP集锦
- 三年级学雷锋主题班会
- 食品安全制度(食品经营许可证办理)完整版直接使用
- 铁道部机关及18个铁路局职位与人员名单2011年3月修改
- 公共基础知识题库:社会公德与职业道德试题及答案解析(一)
- 新人教版七年级下册第六章实数全章教案
- 大学生工程地质实习报告
- 双向文化导入在高中英语教学中的运用
- 吉林大学网络资源一览
- 2013年年会计从业资格考试法规考点:国库集中收付制度每日一练(
- 学子爱心之家母亲节感恩活动策划书(1)
- “十三五”重点项目-铌生产项目商业计划书
- 小议农村中学的控辍保学工作的重要性
- 诚信奖惩制度范本
- 湖南省衡阳市2015年中考物理试题(word解析版)