大学java课程设计.docx
- 文档编号:6961553
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:27
- 大小:142.08KB
大学java课程设计.docx
《大学java课程设计.docx》由会员分享,可在线阅读,更多相关《大学java课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
大学java课程设计
Java聊天室
摘要
在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,网络聊天一类的聊天系统的发展日新月异,该系统采用了线程及socket通信技术,使用了Java的图像化界面工具swing,在eclipse开发工具中进行开发。
该系统的开发时给予C/S的架构,由客户端与服务器端进行通信,并且在服务器端进行逻辑判断和处理。
该系统主要包括登录、注册、添加和删除好友、聊天、查找好友、文件传输等功能模块。
关键词
java聊天室客户端服务器端
1系统需求分析
1.1开发背景
随着计算机的快速发展,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,网络聊天时一类的聊天系统的发展日新月异,而且通过制作该程序还能更好的学习网络软件编程知识.在即时聊天工具的出现之前,e-mail一直做为传统的信息交流工具,也是因为e-mail发送和接受消息时间相对滞后的缘故,不能满足人们迅速获取信息的要求。
即时通讯工具的产生,为大众提供了一种崭新的综合的信息交流平台。
即时通讯不同于传统的通讯工具e-mail,在于它的交流是实时的,使得人们交流更加便捷和快速,满足了人们迅速获取信息的需求,所以深受大众的喜爱,有着很好的发展前景。
其中聊天软件就是即时通讯的具体实现。
1.2系统概述
本系统是一款普通的网络聊天工具,该软件主要有一对一聊天,一对多聊天,文件的传输,信息的保存等功能。
系统是基于TCP/IP的网络协议,使用JavaSocket进行通信,用现在最流行的网络开发语言Java进行编写实现。
本设计围绕Java编程语言在网络编程方面的具体应用,论述了使用面向对象方法,对计算器程序进行需求分析、概要设计、详细设计,最后使用Java编程实现的全过程。
在编程我们使用的java语言,是目前比较流行的编程语言。
在当今这个网络的时代,java语言在网络编程方面的优势使得网络编程有了更好的选择。
Java语言最大的特点是具有跨平台性,使其不受平台不同的影响,得到了广泛的应用。
2问题重述
2.1系统介绍
用java实现基于C/S模式的聊天室程序。
聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需要登陆到服务器端才可以实现正常的聊天功能。
该系统采用了线程及socket通信技术,使用了Java的图像化界面工具swing,在eclipse开发工具中进行开发。
该系统的开发时给予C/S的架构,由客户端与服务器端进行通信,并且在服务器端进行逻辑判断和处理。
该系统主要包括登录、注册、添加和删除好友、聊天、查找好友、文件传输等功能模块。
2.2功能要求
A、服务器端主要功能如下
(1)在特定端口上进行侦听,等待客户端连接。
(2)用户可以配置服务器端的侦听端口,默认端口为8888。
(3)向已经连接到服务器端的用户发送系统消息。
(4)统计在线人数。
(5)当停止服务时,断开所有的用户连接。
B、客户端的主要功能如下
(1)连接到已经开启聊天服务的服务器端。
(2)用户可以配置要连接的服务器端的IP地址和端口号。
(3)用户可以配置连接后显示的用户名。
(4)当服务器端开启的话,用户可以随时登陆与注销。
(5)用户可以向所有人或某一个人发送消息。
3理论分析
当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器Socket建立连接,再用对象输出流包装Scoket的输出流将聊天信息对象发送给服务器,当用户发送聊天信息时,服务端将会收到客户端用Scoket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天信息对象集Message中,以供所以聊天用户访问,接受用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新信息,在程序中设定的是每3秒刷新一次服务器,如果时间间隔太短将会增加客户端与服务器的通信负担,而间隔时间长就会让人感觉没有时效性,所以权衡后认为3秒最佳,因为每个用户可能在3秒内连续发送信息。
当每次用户接收到信息后将会开始分析聊天信息然后显示在聊天界面上。
4系统详细设计
4.1总体结构
使用了典型的C/S架构,如下所示:
4.2数据库设计
用户表User:
列明
类型
长度
是否为主键
描述
Username
varchar
32
是
用户名
Nickname
varchar
32
昵称
Password
varchar
32
密码
Gender
char
1
性别:
缺省0男
Age
int
4
年龄
City
varchar
32
城市
Online
char
1
是否在线
好友表Friend:
列明
类型
长度
是否为主键
描述
Id
int
8
是
标识id
username
varchar
32
外键
用户名
Friendname
varchar
32
外键
用户名(好友)
4.3页面设计
4.3.1注册页面
用户在登录页面可以直接登录系统,若是新用户没有登录信息,则会被引导到该页面进行注册,注册新用户时,需要安装一定的规则输入用户信息,有必填项,以及相应的验证。
4.3.2注册过程分析
需求描述:
用户填写系统给出的注册项目,并提交给系统,成功注册后,系统生成用户所注册的登入ID,并保存在数据库当中。
执行者:
用户
前置条件:
无
后置条件:
无
正常过程:
(1)向服务端发送注册请求
(2)服务端响应客户端,客户端弹出注册信息表单
(3)用户填写完表单后将注册数据传给服务端处理,并保存在数据库中
(4)返回客户端一个响应,显示用户注册的ID,提示注册成功
异常过程(可选):
用户填写表单的数据格式不正确或表单中存在空缺的项,客户端给予提示信息,并将光标定位到出错的地方。
用户注册的项在数据库中发生冲突,客户端提示注册不成功并提示用户重新填写表单。
服务器未启动或出现异常
通过注册模块实现用户的在线注册,所填写的注册项目有:
用户名、密码、密码确认、性别、年龄、E-mail。
注册流程
4.3.3登录页面
用户在登录页面,可以输入用户名和密码进入系统,当然,若用户输入的用户名和密码不正确,系统会给出提示,新用户也可以通过该页面链接到注册页面进行注册,然后回到该页面进行登录
4.3.4登录过程分析
需求描述:
用户填写登入用户名和密码,经服务器验证成功后进入聊天室主界面。
执行者:
用户
前置条件:
用户成功注册或已经拥有一个合法的ID号
后置条件:
无
正常过程:
(1)向服务端请求连接,并发送登录信息。
(2)服务端处理并查询数据库中的用户信息
(3)返回客户端一个响应,提示登录成功,弹出聊天室主界面。
(4)刷新其他在线用户的用户列表信息
异常过程(可选):
(1)用户填写的ID或密码与数据库中的纪录不匹配,客户端
(2)提示登录失败。
(3)客户端设置的服务器地址或端口有误。
(4)服务器未启动或出现异常。
登录过程
4.3.5登录成功后的用户主页面
用户登录成功之后,在用户的主界面会显示出用户的好友列表等信息,同时也会显示出该用户的好友是否在线等信息,右键单击用户即可查看用户资料如下图:
搜索用户,并可以通过该页面添加好友,页面如下:
查看资料:
点击聊天室,可以实现群聊:
5系统测试
5.1测试程序登录界面
打开程序后,首先出现的是登录页面,在设置好网络IP和端口号之后,输入用户名和密码,如果连接服务器成功则提示用户输入的用户名和密码是否正确,否则提示连接不到服务器,并提示正确设置服务器IP和服务端口。
其中端口号只能设置1024之后的端口号,前面的地址为服务器作为保留地址用,否则程序会提示错误。
5.2测试程序主界面
进入主界面后,主页面会显示在线用户列表区、信息显示区、功能设置区、信息发送区、功能按钮区。
用户可以在用户列表中看到目前在线的其他用户,并在信息显示区内看到系统提示。
用户可以在信息发送区内输入自己的发送内容,并可以通过功能设置区设置字体内容的属性和发送表情。
可以通过单击用户列表名中的用户弹出私聊窗体,进行私聊,发送的信息其他用户不可以见。
在主界面的显示区中可以不断的查看到其他用户发送过来的信息,并可以通过点击查看记录按钮查看保存的聊天记录。
5.3测试程序退出
当单击退出按钮或窗体的关闭时,用户将发送退出信息,离开聊天室,其他用户可以得到系统提示用户下线并刷新用户列表。
当服务器出线异常或关闭时,客户端将提示服务中断并退出系统。
5.4测试项目
5.4.1测试方法
由于实际开发过程中还是不可避免地会产生差错,系统中通常可能隐藏着错误和缺陷,不经周密测试的系统投入运行,将会造成难以想象的后果,因此系统测试是软件开发过程中为保证软件质量必须进行的工作。
大量统计资料表明,系统测试的工作量往往占软件开发总工作量的30%以上。
因此,我们必须重视测试工作。
由于程序中隐藏的缺陷只在特定的环境下才有可靠显露,系统缺陷通常是由于对某些特定情况考虑不周造成的。
因此测试不是为了表明程序正确;成功的测试也不是没有发现错误的测试。
有意义的软件测试应该是从“破坏”软件系统的角度出发,精心设计最有可以暴露程序系统缺陷的测试方案。
因此软件测试的目标应该是以尽可能少的代价和时间找出软件系统中潜在的错误和缺陷。
从产品角度看,测试计划中的测试项目包括软件结构中的分系统层、子系统层、功能模块层、程序模块层中的各类模块,从测试本身看,分为单元测试,组合测试,确认测试等。
测试对象是随不同阶段而异的,最基本、最初的测试是单元测试,后面的组合测试、确认测试都是以被测过的模块作为测试对象的。
5.4.2单元测试
单元测试也称模块测试或程序测试,单元测试是对每个模块单独进行的,验证模块接口与设计说明书是否一致,对模块的所有主要处理路径进行测试且与预期的结构进行对照,还要对所有错误处理路径进行测试。
对源码进行审查,对照设计说明书,表态地检查源程序是否符合功能的逻辑要求,是进行单元测试前的重要工作工。
单元测试一般是由程序员完成,也称程序调试。
5.4.3组合测试
组合测试也称集成测试或子系统测试,通常采用自顶向下测试和自底向上测试两种测试方法。
组合测试的对象是指已经通过单元测试的模块,不是对零散模块进行单个测试,而是用系统化的方法装配和测试软件系统,是一个严格的过程,必须认真地进行,其计划的产生和单元模块测试的完成日期要协调起来,这种测试应在系统目标机上进行,造成系统应用的环境条件,除了开发部分项目负责人参加以外,还应该有相应系统的用户参加,给评审员进行演示。
5.4.4确认测试
确认测试是对通过组合测试的软件进行的,这些软件已经存于系统目标设备的介质上,确认测试的目的是表明软件是可以工作的,并且符合“软件需求说明书”中规定的全部功能和性能要求。
确认测试是按照这些要求定出的“确认测试计划”进行的。
测试工作是由一个独立的组织进行,而且测试要从用户的角度出发。
5.4.5用户验收测试
在系统测试完成后,进行用户的验收测试,它是用户在实际应用环境中所进行的真实数据测试。
在具体的测试中,一般应遵循以下原则:
由程序设计者之外的人进行测试;测试用例应由两部分组成:
输入数据和预期输出结果;应选用不合理的输入数据与非法输入测试;不仅要检验程序是否实现预期功能,还应检查程序是否做了不应该做的工作;集中测试容易出错的程序模块;对程序修改以后,必须重新进行测试
6设计之不足
6.1软件存在的问题
软件已经编写好了,但是还有许多可以改进的地方;同时还存在着一些小问题,还有一些功能上的缺陷,这里我列举一下,并提出一些解决的办法,希望以后可以改进。
(1)操作的方便性、比如可以为一些常用按钮设置快捷键,象登入系统时,输入完用户名和密码后直接回车;在用户输入完要发送的内容时,设置发送内容的快捷方式ctrl+回车等。
(2)在功能方面可以进一步增加,如实现用户间的文件传输,并可以进行视屏,共享音乐等高级功能。
(3)执行效率方面可以有待提高,优化代码结构,减少系统内存泄露,提高运行稳定性等。
6.2美观界面
由于一直专注于功能的实现,从而忽略了界面的设计,本软件今后可以为用户添加不同的头像,并可以使窗体风格更合理和更美观,并且要使用户有更多的自定义功能,设置自己的喜好和风格
7实验心得体会
本次实验是通过自己的努力以及在网上搜索大量的资料来完成的,虽然存在着许多的不足,但这也是对我们这学期所学java语言的一次综合的应用,对所学知识的一次整合,对深入理解这门语言和掌握还是有很大的帮助的。
通过已学的Java知识联系实践来模仿聊天平台,设计出Java版的聊天室,从而来实现简单的聊天室功能,如注册、登陆、聊天等功能。
这样对Java的开发背景会有更进一步的认识,充分掌握和理解Java在现实生活中的应用。
在开发阶段我认真分析和查阅资料通过Java编程来开发出的Java版的聊天室平台在应用的过程中会存在怎样的问题,如何做才能有效的解决这些问题。
针对使用多线程进行多个客户端和服务端的连接时连接不上或出错,作为一个简单的网络聊天室系统,其提供的功能比较有限,有很多可以扩展和改进的地方。
比如能实现用户在聊天室能进行语音聊天,这些需要通过以后的不断学习和实践来实现。
以前很少真正接触到Java的图像化界面编程,运用起来显得有些生疏,做出来的系统界面上不是很美观,系统由于使用了Socket进程间通信以及多线程技术,在程序的并发控制上还有待改进。
相较于C/S架构下的程序开发,我还是更倾向和擅长于B/S架构,毕竟,B/S架构下开发是未来开发的一个趋势。
通过这次设计,我学会了开发系统的一些步骤和其他软件技术的应用,如javaSocket技术,这对我以后的学习和工作有很大的帮助。
所以很感谢大学里的这次java课程设计,它让我学到了很多,同时也告诉自己,在今后的学习中,我应该更加地努力刻苦。
附件:
程序代码及流程图
Server.java
packagemainserver;
importjava.io.IOException;
import.ServerSocket;
import.Socket;
importjava.util.HashMap;
importjava.util.Map;
publicclassServer{
/**
*服务器状态:
true:
开启false:
关闭
*/
privatebooleanrunning;
privatestaticfinalintSERVER_PORT=9999;
publicstaticMap
ServerSocketserverSocket;
/**
*服务器参数初始化
*/
privatevoidinit(){
}
publicServer(){
}
/**
*服务器开启
*/
publicvoidstart(){
init();
try{
serverSocket=newServerSocket(SERVER_PORT);
}catch(IOExceptione){
System.out.println("ServerSocket建立失败");
e.printStackTrace();
return;
}
startServer();
while(running){
Socketsocket=null;
try{
System.out.println("Listenning......");
socket=serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress());
newServiceHandler(socket).start();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
publicvoidcloseServer(){
running=false;
System.exit(0);
}
privatevoidstartServer(){
running=true;
}
publicbooleanisRunning(){
returnrunning;
}
}
ServiceHandler.java
packagemainserver;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
import.Socket;
importjava.util.Arrays;
importjava.util.Iterator;
importjava.util.List;
importmessages.AddFriend;
importmessages.DelFriend;
importmessages.Friends;
importmessages.Info;
importmessages.Login;
importmessages.MessageEnd;
importmessages.Regist;
importmessages.SearchFriend;
importmessages.Send;
importmessages.Update;
importdao.Friend;
importdao.FriendDAO;
importdao.User;
importdao.UserDAO;
/**
*处理单个客户端请求的线程如果socket读取或发送数据失败,按用户退出登陆处理
*
*@authorAdministrator
*
*/
publicclassServiceHandlerextendsThread{
privateSocketsocket;
privateBufferedReaderin;
privateOutputStreamout;
privatebooleanisOK;
privateStringcurrentUser;
publicServiceHandler(Socketsocket){
this.socket=socket;
isOK=true;
try{
out=socket.getOutputStream();
}catch(IOExceptione){
e.printStackTrace();
isOK=false;
return;
}
try{
in=newBufferedReader(newInputStreamReader(socket
.getInputStream()));
}catch(IOExceptione){
e.printStackTrace();
isOK=false;
}
}
/**
*向客户端发送数据如果发送失败,修改用户状态为未登录
*
*@parammsg
*/
publicsynchronizedvoidsend(Stringmsg){
if(!
isOK){
return;
}
try{
System.out.println("send:
"+msg);
//ShowErrorMsg.display(msg);
out.write(msg.getBytes());
out.flush();
}catch(IOExceptione){
userQuit();
}
}
privatesynchronizedStringread(){
Stringtmp=null;
try{
tmp=in.readLine();
}catch(IOExceptione){
e.printStackTrace();
userQuit();
}
if(tmp!
=null){
returntmp;
}
returnnull;
}
/**
*发送或接收数据失败,修改用户状态
*
*@paramb
*/
privatevoidchangeUserState(booleanb){
//设定为上线
if(b){
synchronized(Server.connections){
Server.connections.put(this.currentUser,this);
}
}else{
synchronized(Server.connections){
Server.connections.remove(this.currentUser);
}
}
newUserDAO().setOnline(this.currentUser,b);
}
/**
*如果读取失败,修改用户状态为未登录从客户端读取数据
*
*@paramsocket
*/
privateStringreceiveTitle(){
StringBufferbuffer=newStringBuffer();
if(!
isOK){
returnbuffer.toString();
}
Stringtmp=null;
try{
if((tmp=in.readLine())!
=null){
buffer.append(tmp);
}
}catch(IOExceptione){
userQuit();
returnbuffer.toString();
}
returnbuffer.toString();
}
privatevoiduserQuit(){
System.out.println("失去一个连接。
");
isOK
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 java 课程设计