java课程设计.docx
- 文档编号:4574771
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:28
- 大小:121.93KB
java课程设计.docx
《java课程设计.docx》由会员分享,可在线阅读,更多相关《java课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
java课程设计
Java网络编程实践
课程设计说明书
课程名称:
Java网络编程课程设计
题目:
基于C/S的班级聊天室(群聊)工具
姓名:
学号:
教学班级:
指导教师:
****大学软件科学与工程系
二○一三年十二月廿五日
Java网络编程实践任务书
目的:
熟悉JAVA语法,掌握图形化界面、多线程、网络、数据库等综合编程,掌握用编程语言开发由若干功能组成的小型项目的基本流程,增强动手实践能力,巩固和加强书本知识的学习,体会JAVA编程的特点。
题目1:
基于C/S的班级即时通讯工具(2人)
要求:
1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:
服务器端存储最少一个班级的信息;最好多个班级,主要存储班级若干学生的基本信息。
用数据库存储。
下面所有功能只考虑一个班是基本实现,考虑多个班是拓展实现。
3.界面:
GUI界面,友好直观,布局合理,方便的功能入口。
4.功能:
1)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;
2)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班(只考虑一个班的情况)。
或是否是某个班的学生(多个班的情况)。
验证通过进入主界面,否则给出错误提示。
3)主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班则可以添加别班好友并经对方批准)。
4)即时聊天,选中某个好友,双击打开窗口聊天。
如果不在线则服务器等对方上线后转发(此功能属拓展实现)。
5)可以修改自己的登陆密码。
题目2:
基于C/S的班级聊天室(群聊)工具(2人)
要求:
1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:
服务器端存储至少两个班级的信息;主要存储班级若干学生的基本信息。
用数据库存储。
3.界面:
GUI界面,友好直观,布局合理,方便的功能入口。
4.功能:
a)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;
b)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班。
验证通过进入主界面,否则给出错误提示。
c)主界面应划分几个部分,至少有聊天室窗口部分(显示多人的聊天信息),自身发送聊天信息的窗口部分,聊天室成员列表部分,最好实现在线用户区别显示(此功能属拓展实现)等。
进入主界面就可以参与群聊。
d)群聊时,只能看见自己同班同学的发言。
e)可以修改自己的登陆密码。
题目3:
基于C/S的学生信息管理(1人)
实现应用,可以通过网络在客户端对存放在服务器端的学生信息表(至少包含学号、姓名、性别、年龄、籍贯等字段)学生纪录增、删、改、查,并返回结果。
要能通过菜单选择功能。
基于Socket,多客户端使用多线程,以能同时从多个客户端执行功能。
必须提供友好直观、布局合理的图形界面选择功能、显示信息和填写修改信息。
成员列表:
分工列表:
登陆界面
修改密码界面
聊天窗口界面
服务器代码
连接数据库
课程设计报告
1、项目简述和目的
(一)简述
聊天室做为即时通讯的一种,即时通讯(InstantMessenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微软的MSNMessenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。
而且,现在不少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。
要求:
1、C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2、数据存储:
服务器端存储至少两个班级的信息;主要存储班级若干学生的基本信息。
用数据库存储。
3、界面:
GUI界面,友好直观,布局合理,方便的功能入口。
4、功能:
a)登陆输入用户名和密码;用户名是学号,有初始密码,例如111111;
b)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班。
验证通过进入主界面,否则给出错误提示。
c)主界面应划分几个部分,至少有聊天室窗口部分(显示多人的聊天信息),自身发送聊天信息的窗口部分,聊天室成员列表部分,最好实现在线用户区别显示(此功能属拓展实现)等。
进入主界面就可以参与群聊。
d)群聊时,只能看见自己同班同学的发言。
e)可以修改自己的登陆密码。
(二)目的
通过此项目实训——JAVA聊天室的设计,实践、总结、回顾了网络编程思想以及编程方法,并通过编写程序来掌握Java语言编程技巧,将学习到的知识融会贯通,同时提高调试程序的能力,养成良好的编程习惯,并增强对程序设计整体思路的把握,理论与时间相结合。
本文的主要工作集中在:
该课程基于C/S模式,客户机向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。
当用户聊天时,将当前用户名、聊天对象、聊天,内容进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。
进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解,针对JAVA语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
二、解题基本思路
聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。
因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:
在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。
因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。
1.首先通过继承JFrame类构造服务器界面。
2.设计客户端程序使其能够完成正常的通信功能。
3.设计侦听程序,使其显示登录的ip地址端口号,以及用户昵称,通过侦听按钮可以调用客户端程序,实现聊天功能。
三、分析和设计
本系统主要通过客户端,服务器端来体现聊天系统的基本功能。
(一)服务器端
1.处理用户登录
2.处理用户发送信息,服务器监控聊天内容,服务器过滤非法内容
3.处理用户得到信息
4.处理用户退出
5.保存用户聊天信息。
(二)客户端
1.用户登录界面及结果
2.用户发送信息界面及结果
3.用户得到信息界面及结果
4.用户得到信息界面及结果
5.用户退出界面及结果
目前国内外做聊天系统的公司很多,产品也琳琅满目,国内有诸如腾讯QQ、新浪UC、网易泡泡等,国外有著名的MSN(新版改名为LiveMessenger)以及跨平台Gaim等。
本人取最具代表性的QQ和MSN进行了一些研究,作为我开发聊天系统的准备。
腾讯无疑是国内即时通讯市场的霸主,自从99年进入即时通讯领域并迅速占市场之后,其在国内用户数量始终高居榜首,即使近几年面对微软MSN的强大攻势,腾讯QQ的时常占有率依然稳步增长。
腾讯的成功与其对QQ的不断创新和完善是分不开的。
参考了许多网络上的资料,以及自己通过观察腾讯QQ运行时的各种细节。
可以确定腾讯QQ是以多服务器提供服务、服务器总控客户端、客户端之间UDP直连通信的。
并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。
(三)、模型
如图1-1
四、主要程序源代码
/*客户端*/
packagecom.mk;
importjava.io.*;
import.*;
importjava.nio.*;
importjava.nio.channels.*;
importjava.nio.charset.*;
importjava.sql.SQLException;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassChatClient{
JFramedl1=newJFrame("QQ2014");//创建登录窗口
JLabella_ch=newJLabel("账号");
JLabella_mm=newJLabel("密码");
JButtonjbt=newJButton("登录");
JButtonjbt1=newJButton("修改密码");
JTextFieldtext_ch=newJTextField(18);
JPasswordFieldtext_mm=newJPasswordField(18);
//设置文本框长度
JFramejgm=newJFrame("修改密码");//创建修改密码窗口
JLabella1_ch=newJLabel("账号");
JLabella1_xm=newJLabel("新密码");
JLabellab1_qm=newJLabel("确认密码");
JButtonjbt_qd=newJButton("确定");
JButtonjbt_qx=newJButton("取消");
JTextFieldtext1_ch=newJTextField(22);
JPasswordFieldtext_xm=newJPasswordField(23);
JPasswordFieldtext_qm=newJPasswordField(23);
JPanelpanel1=newJPanel(newFlowLayout(FlowLayout.LEFT,15,10));
JPanelpanel2=newJPanel(newFlowLayout(FlowLayout.LEFT,70,30));
JPanela2_panel3=newJPanel(newFlowLayout(FlowLayout.CENTER,10,10));
BufferedReaderbufferedreader;
PrintStreamprintStream;
JPanelimagePanel1;
ImageIconbackground1;
privateSocketChannelsc=null;
privateStringname=null;
privateJFramef;
privateJTextAreata;
privateJTextFieldtf;
privatebooleanrunnable=true;
publicvoidinit(){
ChatClientcc=newChatClient();
cc.client();
cc.createUI();
cc.inputName();
cc.connect();
newReceiveThread(cc,cc.getTextArea()).start();
}
publicSocketChannelgetSc()
{returnsc;}
publicvoidsetName(Stringname){
this.name=name;
}
publicJTextAreagetTextArea()
{returnta;}
publicJTextFieldgetTextField()
{returntf;}
publicbooleangetRunnable()
{returnrunnable;}
publicvoidstop()
{runnable=false;}
publicvoidclient(){
dl1.add(la_ch);
dl1.add(text_ch);
dl1.add(la_mm);
dl1.add(text_mm);
dl1.add(jbt);
dl1.add(jbt1);
background1=newImageIcon("d:
\\123.jpg");//背景图片来源
JLabellabel=newJLabel(background1);//利用标签添加背景图片
label.setBounds(0,0,background1.getIconWidth(),
background1.getIconHeight());
imagePanel1=(JPanel)dl1.getContentPane();
imagePanel1.setOpaque(false);
imagePanel1.setLayout(newFlowLayout());//设置背景图片位置
dl1.getLayeredPane().setLayout(null);
dl1.getLayeredPane().add(label,newInteger(Integer.MIN_VALUE));
dl1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dl1.setSize(background1.getIconWidth(),background1.getIconHeight());
dl1.setResizable(false);
dl1.setVisible(true);
panel1.add(panel2);
a2_panel3.add(la1_ch);
a2_panel3.add(text1_ch);
a2_panel3.add(la1_xm);
a2_panel3.add(text_xm);
a2_panel3.add(lab1_qm);
a2_panel3.add(text_qm);
a2_panel3.add(jbt_qd);
a2_panel3.add(jbt_qx);
jgm.add(a2_panel3);
jgm.setSize(300,300);//设置修改密码窗口大小
dl1.setLocation(500,100);
jgm.setLocation(500,100);
dl1.setVisible(true);
jbt.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae1){//监听动作事件
try{
Stringname=text_ch.getText();
Stringpassword=text_mm.getText();
try{
if(Client.checkUser(name,password)){
dl1.setVisible(false);
f.setVisible(true);
try{name=text_ch.getText();
sc.write(ByteBuffer.wrap(name.getBytes("UTF-8")));
}catch(Exceptione)
{e.printStackTrace();}
}
else{
JOptionPane.showMessageDialog(dl1,"对不起,密码错误或用户不存在!
");
text_ch.setText("");
text_mm.setText("");
}
}catch(HeadlessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
//调用文本中的信息,进行账号登陆
bufferedreader.close();
}catch(FileNotFoundExceptione1){//抛出异常事件
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}catch(IOExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
}
});
jbt1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
dl1.setVisible(false);
jgm.setVisible(true);
}
});
jbt_qd.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae2){
Strings1=text1_ch.getText();
Strings2=text_xm.getText();
Strings3=text_qm.getText();
if(s2.equals(s3)){
Clientup=newClient();
up.update(s1,s2);
JOptionPane.showMessageDialog(jgm,"密码修改成功");
jgm.setVisible(false);
dl1.setVisible(true);
}
else{
JOptionPane.showMessageDialog(jgm,"两次密码输入不一致");
text_xm.setText(null);
text_qm.setText(null);
}
}
});
//实现修改密码操作,并将用户信息保存到文档里
jbt_qx.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventae3){
//TODOAuto-generatedmethodstub
dl1.setVisible(true);
jgm.setVisible(false);
}
});
}
//关闭窗口
publicvoidshutDown(){
try{
sc.write(ByteBuffer.wrap("bye".getBytes("UTF-8")));
ta.append("欢迎下次使用!
");
this.stop();
Thread.sleep(1000);
sc.close();
}catch(Exceptione)
{
e.printStackTrace();
}
System.exit(0);
}
publicvoidcreateUI(){
f=newJFrame("");
ta=newJTextArea();
ta.setEditable(false);
tf=newJTextField();
JButtonsend=newJButton("发送");
JPanelp=newJPanel();
p.setLayout(newBorderLayout());
p.add(tf,"Center");
p.add(send,"East");
f.add(ta,"Center");
f.add(p,"South");
MyClientListenerlistener=newMyClientListener(this);
send.addActionListener(listener);
tf.addActionListener(listener);
f.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
ChatClient.this.shutDown();
}
});
f.setSize(400,400);
f.setLocation(500,100);
f.setVisible(false);
tf.requestFocus();
}
publicbooleanconnect(){
try{sc=SocketChannel.open();
//"isa"为目
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程设计