java课程设计Word文档格式.docx
- 文档编号:17652110
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:32
- 大小:248.63KB
java课程设计Word文档格式.docx
《java课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《java课程设计Word文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
4、了解Socket编程的协议约定,掌握简单应用协议的开发。
5、进一步巩固发展团队协作能力。
聊天室是一项应用广泛,并且实用性强的一个非常典型的人机交互系统。
在信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通,之类的聊天工具许多人都正在使用。
此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。
第二章设计方案的论证
2.1业务背景
随着网络社会的不断发展,具有相同兴趣的网民需要互相远程交流,既要能省钱又要能即时交互,电话太贵、email又嫌慢,所以开发一个类似QQ的及时通讯系统就变得非常有意义了。
“HappyChat”聊天系统应运而生,它较之QQ的唯一好处是自主开发,用的放心,更适合在局域网内使用。
它提供的功能远不如QQ丰富,但应具有如下功能:
(1)与聊天室成员一起聊天;
(2)可以与聊天室成员私聊;
(3)用户注册、登录;
(4)服务器监控聊天内容;
(5)服务器发送通知;
(6)服务器踢人;
(7)保存服务器日志。
(8)保存用户聊天信息。
2.2技术背景
本系统要求使用java技术开发,使用文件保存数据,集成开发环境使用eclipse。
开发者应有java程序设计语言、SWING基本GUI组件、多线程、文件使用、socket编程、使用eclipse的基本知识和技能。
系统采用两层C/S体系结构,C端负责通过GUI与客户交互,实现注册、登陆、收发信息、退出等功能;
S端是聊天系统的应用服务器,主要有处理用户注册、登录、用户收发信息、用户退出等功能。
C端和S端是通过网络交互的,其基本原理
图1C/S通讯基本原理图
首先服务器启动,它会建立一个专门用于接收客户端连接请求的“倾听Socket”(相当于总服务台,有固定的IP地址和端口号),然后等待客户的连接请求。
当用户想聊天时,从界面输入信息,然后与服务器建立Socket连接(连接时应指定服务器的IP地址和端口号,而客户端socket的端口由本方操作系统从空闲端口中确定),服务器端的“倾听Socket”收到连接请求后,一般会接受连接请求,并生成一个服务端socket(其端口号由服务端操作系统从空闲端口中确定),专门负责与此客户端socket的通信。
一旦连接请求成功,客户端将信息及请求通过本方socket的输出流发送给服务器端相应的socket,服务端则通过服务器端Socket的输入流接受客户端传输过来的信息及请求,分析是何请求,然后根据请求类型,进行相应的处理(如登录、转发信息等)。
服务方也可以根据需要,通过socket的输出流发信息和请求给客户端(公告)。
客户方和服务方都可以通过关闭本方的socket而结束一次通讯过程。
不难发现服务器需要能同时接受多个客户的请求,为了实现这一点,一般使用多线程机制来处理,对每一个客户端连接通讯,服务器端都有一个线程专门负责处理(相当于一个服务员专门服务一个以IP地址和端口号唯一标识的客户)。
上述方式两个聊天者之间通信必须通过服务器进行转发,聊天者多时,显然服务器是个性能瓶颈。
能不能聊天者之间直接通信?
当然可以,这是所谓的P2P聊天室,缺点是对聊天者缺乏集中监管的手段。
也有界于二者之间的,即有一服务器,接受注册和登录,实际聊天双方通信时,仍然是直接通信,此时服务器相当于一个婚姻介绍所,只管牵线搭桥,具体谈还是聊天者自己的事。
本文主要采用聊天信息通过服务器转发的方式,而且只支持一个聊天室。
因为其他典型系统如电子邮件系统,FTP系统均采用类似结构,WEB服务系统本质上也是C/S系统,只不过其客户端是浏览器,采用了HTTP通信协议和HTML,所以变成了B/S结构,可以认为是C/S的一个具体应用,其机理是相似的。
第三章设计实现过程
3.1系统总体结构
总体设计阶段主要是确定系统的体系结构和主要模块,显然系统分客户端子系统和服务器子系统。
系统体系结构如图2所示:
图2系统体系结构图
客户端可以划分成三子层,服务端也可以划分出三个子层,客户和服务器间通信采用的是可靠的TCP协议。
基本的聊天过程如下:
0客户端启动注册、登录后,进入收发界面,此时C/S连接已建立,C处于接收状态。
1客户A从界面输入消息,确定群发,业务逻辑层从界面获取信息并验证后生成“消息接收请求”消息,再将消息作为参数调用网络通信层的发送函数,发送函数将消息发往服务器,然后等待服务器的消息
2服务器收到消息,确定是客户A发来的,从消息中分析出是群发,然后从当前客户列表中取出除A以外的与每个客户(B,C)对应的socket,然后通过socket将消息转发给客户B,C。
3服务器在监控界面上显示:
客户A—〉消息群发
4服务器生成“消息接收成功”消息,向客户A回发(可省)。
5客户A收到消息,确定是“消息接收成功”消息后,在界面上显示发送成功。
6客户B/C的通讯模块接收到消息,分析确认是“消息接收请求”,则在界面上显示:
客户A-〉消息群发。
不向服务器发送消息收到的确认消息。
消息收发的简图如下图3所示:
图3消息收发示意图
要不要回复消息?
由于使用的是TCP协议,可以保证点对点的可靠传输,所以最简单的情况是无需回复,在上图中取消3也可以,客户A将消息发到服务器就认为已成功群发了消息,但若客户B、C都断线,显然消息并没有成功群发。
最复杂的是客户B、C收到消息后也回复给服务器,服务器确认都收到回复后再向A回复。
前者编程简单、性能好,但对于某些异常情况不能可靠处理,后者编程复杂,性能差,但可靠性高。
这就要根据情况在上述矛盾中折中,对于“聊天室系统”,对可靠性要求并不高,即使消息有5%未收到,也没有大的问题,另外聊天者是处理各种不可靠问题的最佳人选,实在不行,可由人重启系统(不会带来任何人身及财物损失),另外本系统主要应用在局域网,而局域网的可靠性是较高的。
所以本文推荐采用无回复方式。
这适用于其它消息的处理。
消息的收发方式?
主要分两种,一种是推方式,例如客户A有了消息就直接发给服务器,这是推方式,即由数据源方直接将消息发给接收方;
另一种是拉方式,即接收方主动向数据源请求获取数据,例如服务器通过定期询问客户A有无数据的方式,客户A一旦有消息,就会发消息给服务器。
显然这两种方式应用的场合是不一样的,上文中描述的是“推”方式,客户A将消息发(推)给服务器,服务器将消息再转发(推)给其它客户。
数据源(客户A)的特点是消息的产生是不确定的(接收方难以知道发方何时有消息),产生就发是高效的方式,若服务器采用轮询的方式,一方面在大多数情况下会产生许多无谓的询问,另一方面会降低服务器的性能(特别是服务器可能成为整个系统的性能瓶颈,这就尤为重要),这里还隐含了一个假设:
在聊天过程中,服务器一直等待消息的到来,B、C也随时能接受消息,所以发送(推)一般是能成功的。
服务器向客户B,C推消息(相当于客户B、C接收消息),是基于B、C都在准备接收的假设,这一点较之服务器一直可靠运行的假设,其假设的有效性较低,因为客户方的行为难以预料,可能客户重启了系统,可能突然断电等。
服务器可能白发了消息(为保证消息发到客户,服务器会重复发送消息,造成性能损失),因为它不知道客户是否在等着接收消息,这时可以考虑客户方主动接收消息,通过定期轮询的方式,向服务器要数据,这时服务器就知道客户一定能接收消息,所以就发消息给客户,这种方式是“拉”方式。
此方式较之服务器直接推,服务器性能上有所损失,主要用于处理客户的轮询消息(较之重发消息,开支一般较小),客户方因为要轮讯,也损失性能,但这对于客户端并不重要(其计算能力绝大部分情况下都足够),编码量上C/S均增加了,它的好处是如果多数情况下不能保证客户方一直在线,则服务方可以处理多次轮询,但只发一次消息给客户,较之不断的重发消息给客户(尤其是大量用户群发时)总体性能上是提高的。
轮询时间的确定主要是在消息收发的及时性和性能影响之间取得平衡,周期过小,服务器处理压力大,周期过长,客户不能及时收到消息,一般可取2—5秒。
推荐的方式是“推”方式,因为“HappyChat”应用于局域网,网络条件较好,且基于可靠的TCP协议传输消息,本身对可靠性要求也不高,具体说就是服务器向客户转发消息时,不管成功与否只发一次,客户向服务器发消息时,若出错,不会自动重发,但会给出提示,由聊天者决定是否重发(如再次按发送按钮)。
即认为在多客户聊天过程中服务器一直正常运行,客户端也一直正常。
这样做以后,简化了设计编码,性能也得到提高。
3.2服务器结构
服务器端主要的模块和结构如图所示:
AppServer.java为服务器端监听类,负责服务器的启动,包括启动监听端口、服务器监控界面。
ServerFrame.java为服务器监控窗体,负责监控服务器运行状态,聊天内容,发送公告,踢人……
Connection.java为服务器连接处理的具体实现。
WordFilter.java语言过滤类,处理非法聊天内容的过滤。
(可选)
3.3客户端结构
客户端主要模块和结构如图所示:
ChatClient.java为客户端程序启动类,负责客户端的启动和退出。
Login.java为客户端程序登录界面,负责用户帐号信息的验证与反馈。
Register.java为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
ChatRoom.java为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java亲密合作。
Windowclose为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。
Clock.java为客户端程序的一个小程序,实现的一个石英钟功能。
第四章调试运行及结果分析
4.1注册模块
程序将通过Register.java用户注册界面收集用户的用户名、密码、年龄、电子邮箱等。
参考界面如图6。
图6客户端注册界面
处理过程:
当用户注册时,客户端的Register.java界面收集并验证了用户的注册信息后,封装成Register_Customer类然后通过建立在Socket的连接之上的对象输出流将用户注册信息发送给服务器端,服务器端将请求转发给Connection处理,Connection在收到信息后将验证数据的完整性并在数据库中查找该用户名是否已经注册,然后将注册信息加入数据库,最后将注册结果返回给客户端。
客户端显示结果(重名、成功、失败),并断开连接。
验证要求如下:
1验证用户名是否为空
即用户名的字符长度不为0,如果验证通过,就继续下面验证,否则返回“用户名为空”错误。
2验证密码是否为空
即密码的字符长度不为0,如果验证通过,就继续下面验证,否则返回“用户密码为空”错误。
3验证密码的一致性
验证密码两次输入是否一致,如果验证通过,就继续下面验证,否则返回“密码两次输入不一致,请重新输入”错误。
4验证年龄是否为空
即用户年龄的字符长度不为0,如果验证通过,就继续下面验证,否则返回“用户名为空错误”
5验证年龄的合法性
即用户年龄介于10到100之间,如果验证通过,就进行继续下面验证,否则返回“用户年龄为空”
6验证电子邮箱的合法性
即电子邮箱字符串必须有“@”,如果验证通过,就进行继续下面验证,否则返回“电子邮箱不合法”,
4.2登录模块
程序将通过Login.java用户登录界面收集用户的用户名、密码,如图7所示。
图7客户端登录界面
登录过程如下:
当用户登录时,客户端由Login.java界面收集并验证用户登录信息后,封装成Customer对象类然后通过建立在Socket的连接之上的对象输出流将用户登录信息发送给服务器端,服务器端将请求转发给Connection处理,Connection在收到信息后将验证数据的完整性并在对象型数据库中查找该用户名是否已经注册,然后将注册用户的信息与登录请求信息进行密码验证,在登录成功后将该用户添加到在线用户列表,最后将登录结果返回给客户端。
如果登录成功,客户端将继续启动聊天室主界面。
验证要求:
即用户名的字符长度不为0,如果验证通过,就进行继续下面验证,否则返回“用户名为空”错误,
即密码的字符长度不为0,如果验证通过,就进行继续下面验证,否则返回“用户密码为空”错误
当以上信息验证成功时,客户端将打开与服务之间的Socket连接,用对象输出流包装后将用户登录的信息发送给服务器端,并接收服务器处理完用户登录的信息。
当客户端收到服务器返回的信息时,将会用信息对话框的形式告知用户是否注册成功,若成功则显示收发主界面ChatRoom,关闭Socket连接。
4.3收发模块
当用户登录成功后,用户的登录界面将会消失,然后创建用户聊天室窗口(如图),在界面的标题栏将会显示当前登录用户的用户名,以防止一个机器上的用户开多个帐号进入聊天室后分不清哪个窗口是哪个用户登录的,界面第一行将显示当前服务器的在线人数。
位于界面正中的两个控件分别是List和TextBox用来显示当前服务器上的在线会员名单列表和公共聊天信息。
位于界面下方的就是一些用于聊天的功能控件和聊天内容个性化配置控件(可选)。
包括聊天对象、聊天语气、聊天内容、聊天字体、风格、大小、颜色……
4.3.1用户发送信息
当用户需要发送聊天信息时,可以在在线列表中选中聊天对象或者“所有人”,选择发言的语气,和是否私聊就可以发送聊天信息了。
当用户点击完发送按钮后,程序开始将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后获取Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。
4.3.2接收聊天信息
接收用户的聊天信息是用一个单独的接收线程实现的,因为客户端必须随时接收服务器发来的消息,而读取消息的方法采用的一般是读直到有消息到来的“阻塞读”方式,若在事件处理程序中读(占用的是事件处理线程)则会使程序在此后无法响应用户操作,所以需要生成一个单独的线程专门用于读取处理消息。
而发送消息的方法则是将消息放入操作系统的发送缓冲区后就返回的,所以发送执行的相当快,可以在事件处理线程中直接调用。
发送和接收可以同时进行。
当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息显示在聊天信息界面上。
收发界面如图
图8收发界面
图上的字体(个性化)、时钟、保存等是可选的功能,聊天者列表、聊天信息显示,聊天内容、私聊等是必需的。
第五章测试及问题探讨
5.1测试环境:
客户及服务器机操作系统:
WindowXP,内存:
512M。
客户端程序安装在客户机(至少2台)上,通过以太网(网速至少10M)与服务器相连。
前置条件:
1注册文件已创建但为空。
2客户及服务程序安装配置正确,能正常启动运行。
3客户程序与服务程序能通过网络互通。
5.1.1初始化数据
1客户端启动,进入注册界面,输入正确的注册数据,请求注册,查看服务端,看是否正确注册。
2重复1,在另一客户端注册用户,注意不要重名。
5.1.2功能测试
1注册测试。
(1)测试重名注册。
进入注册界面输入重名用户名,其它正确,请求注册。
(2)测试空输入,进入注册界面,直接按注册按钮。
(3)测试口令的一致性,口令长度,年龄及邮箱的数据有效性(具体测试用例设计可参考需求分析及详细设计中的相关部分)。
2登录测试。
(1)输入正确的口令和密码,按登录按钮
(2)空输入,直接按登录按钮。
(3)分别输入用户名不正确但密码正确,用户名正确但密码不正确,用户名和密码均不正确,应均不能正确登录。
(4)以同一用户名重复登录一次
测试
(1)(3)时要查看服务端的显示
3发送接收测试。
(1)进入收发界面,群发一条消息,观察其它客户是否收到消息,察看服务器有无相应显示
(2)私聊一条消息,察看指定用户是否收到消息
(3)无任何输入,直接按发送。
(4)退出系统,察看服务端显示,察看其它客户端是否已将该客户名删除。
(5)再启动客户端,登录进入收发界面,连续群发(至少3次),连续私聊(至少3次),再连续群发,观察其它客户及服务方的显示是否正确。
5.1.3可靠性测试
1切断一客户至服务器的网络连接,分别进行注册、登录消息,客户端应能给出提示,而不是死机或退出,在正常聊天过程中,切断一客户端网络连接,客户程序应能给出提示。
再接通网路,继续发送信息,应能正常运行。
至少关闭并重启程序后,应能正常收发。
同时观察其它客户及服务器收发、客户列表是否正常。
2在正常收发中,强行关闭服务器,观察各客户端的反应。
客户端应给出发送异常提示,不应退出或死机。
四性能测试(可选)
编制一测试程序,作为客户端,登录进系统,向服务器按指定时间间隔群发消息。
可同时启动多个发送线程(模拟多个客户),同时向服务器群发消息。
看在200个模拟客户(200个发送线程),每1s一个消息的情况下,服务器能否满足客户到客户传输时间小于5s的要求。
也可以考虑使用JMeter压力测试工具。
第六章课设总结与体会
经过近几个星期的努力,终于设计出一个基本达到要求的设计。
其功能比较完整,用户界面良好,但是也存在着一些缺陷。
这一段时间的努力,最后的结果固重要,但更重要的是它让自己了解了设计的一般过程。
在做一个项目的时候,首先是进行需求分析,既各种功能需求以及系统结构都要在需求分析中做出来。
接下来做的就是逻辑结构设计,通过逻辑结构设计出数据库。
然后就是详细设计,通过需求分析中对各种功能的描述,利用3自己所学的java知识编写出相应的功能模块界面,这是个比较繁琐的阶段,需要大量的编写和修改各部分代码,以确保系统整体的可运行性。
最后就到了验收成果的阶段,通过系统的运行测试,了解系统的一些问题和不足,并做出一定的修改,最终得到了现在的成果。
编程是一件很枯燥很无聊的事情,但是出于完成作业,得到学分的压力,还必须强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。
而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。
所以认真仔细就是非常重要的了。
开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序4运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。
又经过几天的努力,终于把程序完成了,尽管程序还是有很多错误和漏洞,不过还是很高兴的。
无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习SQL语言的一次实践作业,自己进步的证明。
通过这次课程设计,使我对SQL语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它。
我也发现我的好多不足之处,所以在今后学习过程中,我会更加注视实践操作,更好地学习计算机。
在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前
第七章致谢
通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。
这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。
它还让我学会了在网上查阅那些无限的资料。
让我不仅学会了书本上的知识,还让自己能够面对困难并且克服它。
参考文献
1.赵文靖编著,Java程序设计基础与上机指导,清华大学出版社
2.董迎红、王薇编著,Java程序设计案例教程与实训,北京大学出版社
3.赵文靖编著,《Java程序设计基础与上机指导》,清华大学出版社
4.杜佳荣等编著,Java网络编程技术与实践,清华大学出版社
5.苗春义,Java项目开发全程实录,清华大学出版社
附录
(1)Server.java
packageChat;
import.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
importjava.io.*;
publicclassServerimplementsActionListener{
intcount=0;
//记录点机关闭按钮次数2次关闭
Vectorsoconly=newVector();
//只有SOCKET,用于群发
HashMapsockets=newHashMap();
//所有客户的SOCKET
HashMapsocket_thread=newHashMap();
//Socket所在的线乘,用于退出;
ServerSocketserversocket;
JFrameframe;
JTextAreaarea=newJTextArea();
JPanelpanel=newJPanel();
JButtonstart=newJButton("
启动"
);
JButtonstop=newJButton("
停止"
publicServer(){
//设置样式
//frame.setDefaultLookAndFeelDecorated(true);
//
frame=newJFrame("
服务器"
//添加
panel.add(start);
panel.add(stop);
frame.add(panel,BorderLayout.NORTH);
frame.add(area,BorderLayout.CENTER);
frame.pack();
center();
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
frame.setVisibl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)