Java聊天工具课程设计报告.docx
《Java聊天工具课程设计报告.docx》由会员分享,可在线阅读,更多相关《Java聊天工具课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
Java聊天工具课程设计报告
Java网络编程实践()
课程设计说明书
课程名称:
Java网络编程课程设计_
题目:
__基于C/S的班级即时通讯工具
姓名:
于明帅朱烨枫__________
学号:
201105407201105423
教学班号:
软件工程1101班
指导教师:
王小刚_______
兰州交通大学软件科学与工程系
二○一二年十二月二十七日
Java网络编程实践任务书
目的:
熟悉JAVA语法,掌握图形化界面、多线程、网络、数据库等综合编程,掌握用编程语言开发由若干功能组成的小型项目的基本流程,增强动手实践能力,巩固和加强书本知识的学习,体会JAVA编程的特点。
题目1:
基于C/S的班级即时通讯工具(2人)
要求:
1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:
服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若干学生的基本信息。
用数据库存储。
下面所有功能只考虑一个班是基本实现,考虑多个班是拓展实现。
3.界面:
GUI界面,友好直观,布局合理,方便的功能入口。
4.功能:
1)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;
2)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班(只考虑一个班的情况)。
或是否是某个班的学生(多个班的情况)。
验证通过进入主界面,否则给出错误提示。
3)主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班则可以添加别班好友并经对方批准)。
4)即时聊天,选中某个好友,双击打开窗口聊天。
如果不在线则服务器等对方上线后转发(此功能属拓展实现)。
5)可以修改自己的登陆密码。
6)
题目2:
基于C/S的班级聊天室(群聊)工具(2人)
要求:
1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:
服务器端存储一个班级的信息;主要存储班级若干学生的基本信息。
用数据库存储。
3.界面:
GUI界面,友好直观,布局合理,方便的功能入口。
4.功能:
a)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;
b)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班。
验证通过进入主界面,否则给出错误提示。
c)主界面应划分几个部分,至少有聊天室窗口部分(显示多人的聊天信息),自身发送聊天信息的窗口部分,聊天室成员列表部分,最好实现在线用户区别显示(此功能属拓展实现)等。
进入主界面就可以参与群聊。
d)可以修改自己的登陆密码。
题目3:
基于C/S的学生信息管理(1人)
实现应用,可以通过网络在客户端对存放在服务器端的学生信息表(至少包含学号、姓名、性别、年龄、籍贯等字段)学生纪录增、删、改、查,并返回结果。
要能通过菜单选择功能。
基于Socket,多客户端使用多线程,以能同时从多个客户端执行功能。
必须提供友好直观、布局合理的图形界面选择功能、显示信息和填写修改信息。
成员名单:
于明帅、朱烨枫
分工列表
登陆界面
于明帅
修改密码界面
朱烨枫
聊天窗口界面
于明帅
服务器代码
朱烨枫
连接数据库
朱烨枫
课程设计报告
于明帅
1、项目简述和目的
聊天室做为即时通讯的一种,即时通讯(InstantMessenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微软的MSNMessenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。
而且,现在不少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。
要求:
1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:
服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若干学生的基本信息。
用数据库存储。
下面所有功能只考虑一个班是基本实现,考虑多个班是拓展实现。
3.界面:
GUI界面,友好直观,布局合理,方便的功能入口。
4.功能:
1)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;
2)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班(只考虑一个班的情况)。
或是否是某个班的学生(多个班的情况)。
验证通过进入主界面,否则给出错误提示。
3)主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班则可以添加别班好友并经对方批准)。
4)即时聊天,选中某个好友,双击打开窗口聊天。
如果不在线则服务器等对方上线后转发(此功能属拓展实现)。
5)可以修改自己的登陆密码。
目的:
通过此项目实训——JAVA聊天室的设计,实践、总结、回顾了网络编程思想以及编程方法,并通过编写程序来掌握Java语言编程技巧,将学习到的知识融会贯通,同时提高调试程序的能力,养成良好的编程习惯,并增强对程序设计整体思路的把握,理论与时间相结合。
本文的主要工作集中在:
该课程基于C/S模式,客户机向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。
当用户聊天时,将当前用户名、聊天对象、聊天,内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。
进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解,针对JAVA语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
2、解题基本思路
当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问,具体实现过程如图3-6所示。
接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。
当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。
3、分析和设计
本系统主要通过客户端,服务器端来体现聊天系统的基本功能。
(1)服务器端
1.处理用户登录
2.处理用户发送信息,服务器监控聊天内容,服务器过滤非法内容
3.处理用户得到信息
4.处理用户退出
5.保存用户聊天信息。
(2)客户端
1.用户登录界面及结果
2.用户发送信息界面及结果
3.用户得到信息界面及结果
4.用户退出界面及结果
目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为LiveMessenger)以及跨平台Gaim等。
本人取最具代表性的QQ和MSN进行了一些研究,作为我开发聊天系统的准备。
腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN的强大攻势,腾讯QQ的时常占有率依然稳步增长。
腾讯的成功与其对QQ的不断创新和完善是分不开的。
参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。
可以确定腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连通信的。
并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。
其模型如图1-1
4、主要程序源代码
客户端主要代码:
importjava.awt.*;
importjava.awt.List;
importjava.awt.event.*;
importjava.io.*;
import.*;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjavax.swing.*;
publicclassChatlogoextendsJFrame{
JFramea1=newJFrame("QQ2012");//创建登录窗口
JLabellab1=newJLabel("账号");
JLabellab2=newJLabel("密码");
JButtonbt1=newJButton("登录");
JButtonbt2=newJButton("修改密码");
JTextFieldtext1=newJTextField(26);
JPasswordFieldpasf1=newJPasswordField(26);
//设置文本框长度
JFramea2=newJFrame("修改密码");//创建修改密码窗口
JLabellab3=newJLabel("账号");
JLabellab4=newJLabel("新密码");
JLabellab5=newJLabel("确认密码");
JButtonbt3=newJButton("确定");
JButtonbt4=newJButton("取消");
JTextFieldtext2=newJTextField(22);
JPasswordFieldpasf2=newJPasswordField(23);
JPasswordFieldpasf3=newJPasswordField(23);
JPanelpanel1=newJPanel(newFlowLayout(FlowLayout.LEFT,15,10));
JPanelpanel2=newJPanel(newFlowLayout(FlowLayout.LEFT,70,30));
JPanelpanel3=newJPanel(newFlowLayout(FlowLayout.CENTER,10,10));
//设置按钮及文本框位置
JFramea3=newJFrame();//创建聊天窗口
JPanelpanel4=newJPanel();
JPanelpanel5=newJPanel();
JTextAreaarea1=newJTextArea(12,10);
JTextAreaarea2=newJTextArea(12,8);
JScrollPanescroll1=newJScrollPane(area1);
JScrollPanescroll2=newJScrollPane(area2);
//创建文本区
JButtonbt5=newJButton("发送");
JButtonbt6=newJButton("关闭窗口");
Listlist=newList(15,false);
Checkboxcb=newCheckbox("私聊");
Choicechoice=newChoice();//添加下拉列表框
BufferedReaderbufferedreader;
PrintStreamprintStream;
Socketsocket;
booleanbool=true;
ObjectInputStreamois;
ObjectOutputStreamoos;
JPanelimagePanel1;
ImageIconbackground1;
//添加背景图片
publicChatlogo(){
//choice.add("群聊");
//choice.add("私聊");
a1.add(lab1);
a1.add(text1);
a1.add(lab2);
a1.add(pasf1);
a1.add(bt1);
a1.add(bt2);
background1=newImageIcon("d:
\\tt.jpg");//背景图片来源
JLabellabel=newJLabel(background1);//利用标签添加背景图片
label.setBounds(0,0,background1.getIconWidth(),
background1.getIconHeight());
imagePanel1=(JPanel)a1.getContentPane();
imagePanel1.setOpaque(false);
imagePanel1.setLayout(newFlowLayout());//设置背景图片位置
a1.getLayeredPane().setLayout(null);
a1.getLayeredPane().add(label,newInteger(Integer.MIN_VALUE));
a1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
a1.setSize(background1.getIconWidth(),background1.getIconHeight());
a1.setResizable(false);
a1.setVisible(true);
panel1.add(panel2);
panel3.add(lab3);
panel3.add(text2);
panel3.add(lab4);
panel3.add(pasf2);
panel3.add(lab5);
panel3.add(pasf3);
panel3.add(bt3);
panel3.add(bt4);
a2.add(panel3);
a2.setSize(300,300);//设置修改密码窗口大小
a1.setVisible(true);
a3.setSize(500,400);//设置聊天窗口大小
a3.add(panel4,BorderLayout.CENTER);
a3.add(panel5,BorderLayout.SOUTH);
a3.add(list,BorderLayout.EAST);
//设置各按钮的布局
panel5.add(bt5);
panel5.add(bt6);
panel5.add(cb);
panel5.add(choice);
panel4.setLayout(newGridLayout(2,1));
panel4.add(scroll1);
panel4.add(scroll2);
bt1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae1){//监听动作事件
booleantemp=false;
try{
bufferedreader=newBufferedReader(newFileReader("d:
\\pwd.txt"));
StringsName="";
while((sName=bufferedreader.readLine())!
=null){
String[]sarr=sName.split("");
if((text1.getText().equals(sarr[0]))&&(pasf1.getText().equals(sarr[1]))){
temp=true;
break;
}else{
temp=false;
}
}
if(temp==false){
JOptionPane.showMessageDialog(a1,"对不起,密码错误或用户不存在!
");
}else{
oos.writeObject("账号:
"+text1.getText());
a1.setVisible(false);
a3.setTitle(text1.getText());
a3.setVisible(true);
}
//调用文本中的信息,进行账号登陆
bufferedreader.close();
}catch(FileNotFoundExceptione1){//抛出异常事件
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}catch(IOExceptione1){//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
}
});
bt2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
a1.setVisible(false);
a2.setVisible(true);
}
});
bt3.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae2){
try{
PrintWriterprintwrite=newPrintWriter(newFileWriter("d:
\\pwd.txt",true));
Strings1=text2.getText();
Strings2=pasf2.getText();
Strings4=pasf3.getText();
Strings3=s1+""+s2;
bufferedreader=newBufferedReader(newFileReader("d:
\\pwd.txt"));
Stringss=bufferedreader.readLine();
inta=0;
while(ss!
=null){
String[]sss=ss.split("");
a=compare(sss[0],s1);
if(s2.equals(s4))
{
if(a==1){
JOptionPane.showMessageDialog(a2,"该账号已被使用");
break;
}
ss=bufferedreader.readLine();
if(a==0){
printwrite.println(s3);
JOptionPane.showMessageDialog(a2,"密码修改成功");
a2.setVisible(false);
a1.setVisible(true);
break;
}
}
else{
JOptionPane.showMessageDialog(a2,"两次密码输入不一致");
break;
}
}
printwrite.close();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
});
//实现修改密码操作,并将用户信息保存到文档里
bt4.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae3){
//TODOAuto-generatedmethodstub
a1.setVisible(true);
a2.setVisible(false);
}
});
choice.addItemListener(newItemListener(){
publicvoiditemStateChanged(ItemEvente)
{
}
});
bt5.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae4){
try{
if(cb.getState()){
oos.writeObject("私聊:
"+text1.g