即时通网络通信系统的设计与开发.docx
《即时通网络通信系统的设计与开发.docx》由会员分享,可在线阅读,更多相关《即时通网络通信系统的设计与开发.docx(23页珍藏版)》请在冰豆网上搜索。
即时通网络通信系统的设计与开发
Java课程设计报告
题目“即时通”网络通信系统的设计与开发
课程设计报告单
学号
姓名
专业班级
软件工程(莱)12-2
考核项目
评分
备注
1
平时工作态度及遵守纪律情况
(10分)
2
掌握基本理论、关键知识、基本技能的程度和阅读参考资料的水平
(10分)
3
独立工作能力、综合运用所学知识分析和解决问题能力及实际工作能力提高的程度
(20分)
4
完成课程设计说明书及软件的情况与水平(小组分工情况、规范性、整洁清楚、叙述完整性、思路清晰程度、工作量及实际运行情况和创新性)
(60分)
总评成绩
综合评定:
(优、良、中、及格、不及格)
指导教师签字:
2014年12月26日
《Java课程设计》任务书
一、课程设计任务及要求:
任务:
针对小型信息管理系统或若干综合性设计题目,选择一种软件开发模型,完成从需求分析、系统设计、系统实现,软件测试的全过程。
要求:
(1)根据软件系统开发的一般原则,完成相应系统的功能设计,完成主要功能模块的程序实现并进行测试训练,给出代码运行结果和相应的设计文档。
可以分组进行,但所有学生必须经历整个系统的开发全过程,以便加深对系统开发全过程的认识。
(2)提交课程设计报告。
(3)指标:
要求完成课程设计报告3000字以上(约二十页);完成所设计的题目,设计题目的语句行数的和在200行语句以上。
二、工作量
2周(10个工作日)时间
三、计划安排
第1个工作日-第2个工作日:
查找相关资料、书籍,阅读示例文档;设计程序结构、模块图、完成类的设计。
第3个工作日-第7个工作日:
完成程序的编码,并且自己调试、测试。
穿插进行项目文档的撰写。
第8个工作日-第9个工作日:
撰写和整理项目文档。
第10个工作日:
由教师检查软件测试效果、项目文档,给出学生本课程成绩。
指导教师签字:
2014年12月15日
目录
题目:
1
1.需求分析1
2.概要设计1
2.1系统总的设计思路1
2.2体系结构1
2.3功能模块图1
3.详细设计3
4.编码3
4.1在登陆界面设置用户名和密码不能为空并给出提示3
4.2如果用户登陆成功如何直接进入聊天界面.3
4.3如何设置性别,是用户注册后性别显示在数据库表中4
5.调试分析5
6.测试结果及运行效果5
7.系统开发所用到的技术8
8.课程设计总结8
参考文献9
附录全部代码10
题目:
“即时通”网络通信系统的设计与开发
1.需求分析
《即时通》,是一个类似于QQ的网络通讯软件,系统包含了登陆界面,注册界面和聊天界面。
用户通过登陆进入聊天界面和好友进行聊天,用户如果没登陆的用户名和密码可以通过注册后再登录进入聊天界面和好友聊天。
2.概要设计
使用JAVA开发一个类似QQ的网络通讯系统,该系统能够进行用户管理,聊天通讯及系统管理。
该聊天室系统包括客户端和服务器端。
本系统使用JAVASWING技术进行前台界面的设计和开发,使用Socket与ServerSocket网络编程进行客户端与服务器端的连接与通信,使用Java输入输出流进行客户端与服务器端之间的数据传输,使用JDBC技术与后台数据库进行连接和访问。
该系统将能够实现用户登录功能,并能对用户信息进行增加,删除,修改和查询。
登录的用户将可以进行群发,私聊及文件发送和接收。
系统总体架构如下:
图2-1即时通总体框架图
2.1系统总的设计思路
首先设计系统管理,其次设计用户管理,再次设计通讯,最后设计数据库操作。
2.2体系结构
具体为客户端的设计,服务端的设计和公共端的设计。
2.3功能模
图2-2各功能模块流程图
编号
功能名
操作
组件程序
1
系统管理
登录界面
LoginGui.java
登录处理
LoginManager.java
2
用户管理
创建用户界面
UserAddGui.java
维护用户界面
UserEditGui.java
用户管理处理
UserManager.java
3
通讯
聊天主界面
MainChatGui.java
聊天界面
ChatGui.java
文件发送界面
FileSendGui.java
文件接收界面
FileReceiverGui.java
通讯处理
ChatManager.java
4
数据库操作
数据操作封装
JDBCUtil.java
表2-1个模块主要任务
3.详细设计
1“即时通”系统包括三个工程,工程一包括四个程序,分别为:
登陆(Login.java),注册(Register.java),聊天(Chat.java),客户工作者(ClientWorker.java);工程二包括四个程序,分别为:
DB帮助者(DBHelper.jav
a),信息(Message.java),信息服务(MessageService.java),用户(User.java);
工程三包括两个程序,分别为:
服务器(QQServer.java),服务器(ServerWor
ker.java)。
2运行服务器QQServer.java程序,在运行客户端的登陆,客户可以在登陆界面输入自己的用户名和密码点击“登陆”,如果用户名和密码都正确,点击“登陆”按钮会弹出提示框“登陆成功”,点击“确定”按钮将会进入到聊天界面;如果用户名或密码错误点击“登陆”按钮会弹出提示框“登陆失败”,如果用户名或密码为空点击“登陆”按钮会弹出提示框“用户名或密码不能为空”,如果点击“取消”按钮,你的用户名和密码将会被清空,点击“注册”,会直接进入注册界面。
3运行服务器QQServer.java程序,在运行客户端的注册,客户可以在注册界面输入自己的用户名,密码,确认密码,昵称,性别,爱好,城市,职称。
如果用户名和密码错误会弹出注册失败,如果用户名写了,密码没写会弹出提示框“密码不能为空”,如果密码写了,密码没写会弹出提示框“用户名不能为空”,如果用户名和密码注册过,会弹出提示框该“用户已存在,请更换用户名”。
如果用户名,密码,确认密码都正确会弹出提示框“注册成功”。
昵称,性别,爱好,城市,职称可以不写。
4运行服务器QQServer.java程序,在运行客户端的登陆,登陆成功后,客户进入到聊天界面。
可以连续登陆无数个用户,他们可以同时和其他的人聊天,输入要发送的内容再选中对象即可,如果在输入内容没有选择发送的对象将会弹出提示框“请选择好友”,如果没有输入内容就发送给好友将会弹出提示框“输入内容不能为空”。
4.编码
4.1在登陆界面设置用户名和密码不能为空并给出提示?
解决方案:
用if语句写一段代码:
Stringname=nameItem1.getText();
if(name==null||"".equals(name)){
JOptionPane.showMessageDialog(this,"用户名不能为空,请重新输入。
","异常提示",JOptionPane.ERROR_MESSAGE);
return;
}
char[]pwd=pwdItem1.getPassword();
Stringpwd1=newString(pwd);
if(pwd.length==0){
JOptionPane.showMessageDialog(this,"密码不能为空,请重新输入。
","异常提示",JOptionPane.ERROR_MESSAGE);
return;
}
4.2如果用户登录成功如何直接进入聊天界面?
解决方案:
在点击“确定”按钮事件,加上聊天界面的代码,代码如下:
Stringr=(String)result11.getBody();
if(r==null){//登陆成功
JOptionPane.showMessageDialog(this,"登陆成功","弹出提示",JOptionPane.INFORMATION_MESSAGE);
java.awt.EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
newChat(u,s).setVisible(true);
}
});
this.dispose();
}
4.3如何设置性别,使用户注册后性别显示在数据库表中?
解决方案:
在登录代码finalUseru=newUser(name,pwd1l);
中填入null,在注册代码添加:
StringSex=null;
if(Item1.isSelected())
Sex=Item1.getText();
elseif(Item2.isSelected())
Sex=Item2.getText();
elseif(Item3.isSelected())
Sex=Item3.getText();
elseif(Item4.isSelected())
Sex=Item4.getText();
在DBHelper.java代码
pstm=con.prepareStatement("insertintomodo(userName,userPwd,userSex)+"values(?
?
?
)");modo中添加userSex,values中加入?
在代码pstm.setString(1,u.getUserName());
pstm.setString(2,u.getUserPwd());
中加入pstm.setString(4,u.getUserSex());
在User.java中加入privateStringuserSex;
publicUser(StringuserName,StringuserPwd,StringuserSex){
this.userSex=userSex;
}
publicStringgetUserSex(){
returnuserSex;
}
publicvoidsetUserSex(StringuserSex){
this.userSex=userSex;
}
在数据库表设计表中加userSex即可。
测试:
用Access数据库制作表格,配置数据源,运行QQserver,在运行登陆,注册,聊天。
问题1:
如果该用户已经登陆成功没有下怎么能使该用户不能再次登陆。
解决方案:
用if语句判断该用户是否已登录,若已登录则再次登陆时显示登陆失败。
代码如下:
if(usersOnLine.containsKey(u)){
return"用户已经登陆";
}
//检测用户名是否存在
if(!
DBHelper.getInstance().isUserExistes(u.getUserName())){
return"用户已存在";
}
问题2:
若用户输入的消息后没有选中好友就发送怎么提示用户没有选中好友?
解决方案:
用数组合if语句来编写如下代码
StringUsername;
Object[]listname=usersListItem.getSelectedValues();
if(listname.length==0){
JOptionPane.showMessageDialog(this,"请选择聊天好友。
","异常提示",JOptionPane.INFORMATION_MESSAGE);
return;
5.调试分析
在用户登陆的过程中,若用户输入的密码错误,则给出提示并让用户重新输入密码;在用户注册的过程中,若用户不小心把注册信息填写错误,则给出提示并让用户重新填写注册信息;在通讯过程中,聊天内容发送错误系统不会给出提示,如果是文件发送错误,在没有发送成功是用户可以主动的取消发送,经过一系列的分析调试最终把问题解决了
6.测试结果及运行效果
(1)程序运行时,则系统管理界面显示如图6-1所示:
图6-1系统广利界面的显示效果
(2)程序运行时,则用户管理界面显示如图6-2所示:
图6-2用户注册的界面
(3)程序运行时,则用户聊天界面显示如图6-3所示:
7.系统开发所用到的技术
MicrosoftWindowsXP
NetBeansIDE
Access数据库
Java程序组件
8.课程设计总结
经过两周的JAVA课程设计的实习,在老师的细心指导下,我发现了JAVA语言的价值所在,尽管上了十五周的JAVA课,但是我觉得我没学到什么东西,有的代码还看不懂,更不用说写一个好的程序出来。
老师从设计界面开始,一直教到我们把基本程序都做出来,我们就像刚出生的孩子一样什么都不会,如果没有老师的指导,我觉得我们绝不可能设计开发出这个程序。
网上说JAVA语言很有前景,未来的市场很好,现在很多地方都应用了,之前都不知道它到底是怎么创出那么多的财富的,书上写的都是代码。
一直对着书看代码还真看不出它的作用。
现在的大型银行和企业的系统都是用JAVA语言设计开发出发的。
老师鼓励我们好好学它对我们今后的生活有利,学好了我们今后将会容易找到工作。
参考文献
[1]吕凤翥,马皓.Java语言程序设计(第2版)[M].北京:
清华大学出版社,2010
期刊
[2]石振国.用JSP实现对Web数据库的访问[J].计算机应用,2010(05):
5-8.
[4]萨师煊,王珊.《数据库系统概论》高等教育出版社,2002年2月
[5]耿祥义,张跃平。
《java2实用教程》第四版清华大学出版社2012年8月第4版
附录全部代码
ChartGui.java
publicclassChartGuiextendsjavax.swing.JFrame{
privateUseru;
privateSockets;//就是登陆成功的管道
finalstaticintMAXUSER=100;//最多可同时聊天一百个人
publicChartGui(){
initComponents();
}
publicJListgetUsersList(){
returnListItem;
}
publicvoidsetchat2Item(StringusersChart){
Strings=this.chat2Item.getText()+usersChart;
this.chat2Item.setText(s);
}
/**CreatesnewformChartGui*/
publicChartGui(Useru,Sockets){
initComponents();
this.u=u;
this.s=s;
this.setTitle(u.getUserName());
//秘书类,用以不断的接收消息
newClientWorker(s,this).start();
}
publicvoidaddUsers(Listlist){
DefaultListModeldlm=(DefaultListModel)ListItem.getModel();
for(Useru:
list){
dlm.addElement(u);
}
}
publicvoidaddNewUser(Useru){
DefaultListModeldlm=(DefaultListModel)ListItem.getModel();
dlm.addElement(u);
}
publicvoiddelUser(Usercuru){
DefaultListModeldlm=(DefaultListModel)ListItem.getModel();
dlm.removeElement(curu);
}
privatevoidjButton4ActionPerformed(java.awt.event.ActionEventevt){
//TODOaddyourhandlingcodehere:
User[]NUser=newUser[MAXUSER];
StringUsersName;
inti=0;
//=usersList.getSelectedValues();
for(Objecta:
ListItem.getSelectedValues()){
NUser[i]=(User)a;
i++;
}
intj=0;
UsersName=NUser[j].getUserName();
j++;
for(;NUser[j]!
=null;j++){
UsersName=UsersName+","+NUser[j].getUserName();
}
Stringtext=chatItem.getText();
if(NUser==null){
JOptionPane.showMessageDialog(this,"请在在线好友中选择你要聊天的好友","异常提示",JOptionPane.INFORMATION_MESSAGE);
return;
}
if(text==null){
JOptionPane.showMessageDialog(this,"发送信息不能为空!
","异常提示",JOptionPane.INFORMATION_MESSAGE);
return;
}
else{
StringUsersText=this.chat2Item.getText()+"\n"+"您对"+UsersName+"说:
\n"+this.chatItem.getText()+"\n";
chatItem.setText(null);
this.chat2Item.setText(UsersText);
MessagechartM=newMessage(4,u,NUser,text);
MessageService.getInstance().sendMsg(chartM,s);
}
publicJListgetListItem(){
returnListItem;
}
publicvoidsetUsersChartText(StringusersChart){
Strings=this.chat2Item.getText()+usersChart;
this.chat2Item.setText(s);
}
LoginGui
publicSocketconnectServer(){
Sockets=null;
try{
s=newSocket("127.27.21.21",6666);
}
catch(Exceptione){
e.printStackTrace();
}
returns;
}
privatevoidjButton3ActionPerformed(java.awt.event.ActionEventevt){
//TODOaddyourhandlingcodehere:
finalLoginGuigui=this;
java.awt.EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
RegisterGUIdialog=newRegisterGUI(gui,true);
dialog.setLocationRelativeTo(gui);
dialog.setVisible(true);}
privatevoidjButton3MouseClicked(java.awt.event.MouseEventevt){
//TODOaddyourhandlingcodehere:
}
privatevoidjButton2ActionPerformed(java.awt.event.ActionEventevt){
//TODOaddyourhandlingcodehere:
nameItem.setText(null);
pwdItem.setText(null);
this.dispose();
}
privatevoidjButton1ActionPerformed(java.awt.event.ActionEventevt){
Stringname=nameItem.getText();
System.out.println("用户名:
"+name);
char[]pwd=pwdItem.getPassword();
Stringpwd1=newString(pwd);
System.out.println("密码:
"+pwd1);
if(name==null||"".equals(name))
{
JOptionPane.showMessageDialog(this,"用户名不可为空","异常提示",JOptionPane.ERROR_MESSAGE);
return;
}//TODOaddyourhandlingcodehere:
if(pwd==null||"".equals(pwd1))
{
JOptionPane.showMessageDialog(this,"密码不可为空","异常提示",JOptionPane.ERROR_MESSAGE);
return;
}
//发送name和pwd到服务器
//连接服务端
finalSockets=this.connectServer();
//构造消息
finalUseru=newUser(name,pwd1,null,null,null);//以后只发送u代表它们
Messagemsg=newMessage(1,u);//0代表登陆
//执行发送
MessageService.getInstance().sendMsg(msg,s);
//接受消息【接收登陆结果】
Messageresult=MessageService.getInstance().receiveMsg(s);//收消息只传管道Sokects
//取出登陆成功的标志
Stringr=(Str