Java简易聊天工具课程设计报告及代码Word格式文档下载.docx
《Java简易聊天工具课程设计报告及代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Java简易聊天工具课程设计报告及代码Word格式文档下载.docx(34页珍藏版)》请在冰豆网上搜索。
或是否是某个班的学生(多个班的情况)。
验证通过进入主界面,否则给出错误提示。
3)主界面列出该学生好友列表(同班级同学默认全是该生好友,如果是多个班则可以添加别班好友并经对方批准)。
4)即时聊天,选中某个好友,双击打开窗口聊天。
如果不在线则服务器等对方上线后转发(此功能属拓展实现)。
5)可以修改自己的登陆密码。
6)
题目2:
基于C/S的班级聊天室(群聊)工具(2人)
要求:
1.C/S模式,基于Socket实现,服务器端用多线程来处理同时多个客户端连接。
2.数据存储:
服务器端存储一个班级的信息;
主要存储班级若干学生的基本信息。
3.界面:
4.功能:
a)登陆输入用户名和密码;
b)登陆验证根据服务器端存储的班级信息,对输入的用户进行验证,看是否存在于该班。
c)主界面应划分几个部分,至少有聊天室窗口部分(显示多人的聊天信息),自身发送聊天信息的窗口部分,聊天室成员列表部分,最好实现在线用户区别显示(此功能属拓展实现)等。
进入主界面就可以参与群聊。
d)可以修改自己的登陆密码。
题目3:
基于C/S的学生信息管理(1人)
实现应用,可以通过网络在客户端对存放在服务器端的学生信息表(至少包含学号、姓名、性别、年龄、籍贯等字段)学生纪录增、删、改、查,并返回结果。
要能通过菜单选择功能。
基于Socket,多客户端使用多线程,以能同时从多个客户端执行功能。
必须提供友好直观、布局合理的图形界面选择功能、显示信息和填写修改信息。
成员名单:
侯吉超、毛建柏
分工列表
登陆界面
毛建柏
修改密码界面
侯吉超
聊天窗口界面
好友界面
服务器代码
连接数据库
课程设计报告
1、项目简述和目的
聊天室做为即时通讯的一种,即时通讯(InstantMessenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微软的MSNMessenger都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。
而且,现在不少IM软件还集成了数据交换、语音聊天、网络会议、电子邮件的功能。
通过此项目实训——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直连通信的。
并且在两个客户端之间不能建立直连的情况下,才由服务器进行中转通信。
4、主要程序源代码
客户端主要代码:
importjava.io.*;
importjavax.swing.*;
import.*;
importjava.awt.event.*;
importjava.awt.*;
importjava.text.DateFormat;
importjava.util.Date;
classDL
{
privateJFramef,jf;
privateSockets;
privatePrintWriterp;
privateBufferedReaderbr;
privateTextFieldtext1,text2,t,t1,t2,t3;
privateJTextFieldusername;
privateJPasswordFieldpassword;
privateJLabeljl1;
privateJLabeljl2;
privateJButtonjl3;
privateJButtonjl4;
privateJButtonbu1;
privateJButtonbu2;
privateJButtonbu3;
privateJCheckBoxjc1;
privateJCheckBoxjc2;
JTextFieldjtf1;
JPasswordFieldjtf2,jtf3,jtf4;
privateJComboBoxjcb;
JFramea2;
DL()
{
f=newJFrame("
简易通讯软件"
);
//窗体组件初始化
Containercon=f.getContentPane();
jl1=newJLabel();
//设置背景图片
Imageimage1=newImageIcon("
d:
\\登录2.jpg"
).getImage();
jl1.setIcon(newImageIcon(image1));
jl1.setBounds(0,0,355,265);
//QQ登录头像设定
jl2=newJLabel();
Imageimage2=newImageIcon("
登录.jpg"
jl2.setIcon(newImageIcon(image2));
jl2.setBounds(40,95,50,60);
//用户号码登录输入框
username=newJTextField();
username.setBounds(100,100,150,20);
//用户号码登录输入框旁边的文字
jl3=newJButton("
注册账号"
jl3.setBounds(260,100,88,20);
//密码输入框
password=newJPasswordField();
password.setBounds(100,130,150,20);
//密码输入框旁边的文字
jl4=newJButton("
修改密码"
jl4.setBounds(260,130,88,20);
//输入框下方文字
jc1=newJCheckBox("
记住密码"
jc1.setBounds(105,155,80,15);
jc2=newJCheckBox("
自动登录"
jc2.setBounds(185,155,80,15);
jcb=newJComboBox();
jcb.addItem("
在线"
隐身"
离开"
jcb.setBounds(40,150,55,20);
//按钮设定
bu1=newJButton("
登录"
bu1.setBounds(280,200,65,20);
//bu1.addActionListener(this);
//给按钮添加1个事件
try{
s=newSocket("
127.0.0.1"
62000);
p=newPrintWriter(s.getOutputStream());
newDLThread().start();
}catch(Exceptione){}
bu1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
try{
p.println("
denglu"
+"
"
+username.getText()+"
+password.getText());
p.flush();
}catch(Exceptioner){}
}
}
);
bu2=newJButton("
多账号"
bu2.setBounds(5,200,75,20);
bu3=newJButton("
设置"
bu3.setBounds(100,200,65,20);
//所有组件用容器装载
con.add(jl2);
con.add(jl3);
con.add(jl4);
con.add(jc1);
con.add(jc2);
con.add(jcb);
con.add(bu1);
con.add(bu2);
con.add(bu3);
con.add(jl1);
con.add(username);
con.add(password);
jl4.addActionListener(newActionListener(){
temp();
});
jl3.addActionListener(newActionListener(){
//newtemp2();
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//}
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置布局方式为绝对定位
f.setLayout(null);
f.setBounds(0,0,355,265);
//设置窗体的标题图标
Imageimage=newImageIcon("
image:
\\登录.jpg"
f.setIconImage(image);
//窗体大小不能改变
f.setResizable(false);
//居中显示
f.setLocationRelativeTo(null);
//窗体可见
f.setVisible(true);
publicvoidtemp(){
a2=newJFrame("
Containercontainer1=a2.getContentPane();
container1.setLayout(null);
a2.setBounds(200,300,400,300);
a2.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JLabellab4=newJLabel();
JLabellab5=newJLabel();
JLabellab6=newJLabel();
JButtonxg_bt1=newJButton();
JButtonxg_bt2=newJButton();
JLabellab3=newJLabel("
账号"
lab3.setBounds(0,0,200,300);
lab3.setBounds(20,20,80,20);
jtf1=newJTextField(50);
jtf1.setBounds(120,20,260,20);
container1.add(lab3);
container1.add(jtf1);
lab4=newJLabel("
密码"
lab4.setBounds(20,50,80,20);
jtf2=newJPasswordField(50);
jtf2.setBounds(120,50,260,20);
container1.add(lab4);
container1.add(jtf2);
lab5=newJLabel("
新密码"
lab5.setBounds(20,80,80,20);
jtf3=newJPasswordField(50);
jtf3.setBounds(120,80,260,20);
container1.add(lab5);
container1.add(jtf3);
lab6=newJLabel("
确认密码"
lab6.setBounds(20,110,80,20);
jtf4=newJPasswordField(50);
jtf4.setBounds(120,110,260,20);
container1.add(lab6);
container1.add(jtf4);
xg_bt1=newJButton("
确定"
xg_bt1.setBounds(80,150,100,20);
container1.add(xg_bt1);
xg_bt2=newJButton("
取消"
xg_bt2.setBounds(200,150,100,20);
container1.add(xg_bt2);
a2.setVisible(true);
a2.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
xg_bt1.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(!
jtf3.getText().equals(jtf4.getText()))
{
JOptionPane.showMessageDialog(null,"
密码输入不一样"
"
提示"
JOptionPane.ERROR_MESSAGE);
jtf3.setText("
"
jtf4.setText("
else
try{
del"
+jtf1.getText()+"
+jtf2.getText()+"
+jtf3.getText());
p.flush();
}catch(Exceptionex){}
}
});
xg_bt2.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
{
a2.setVisible(false);
classDLThreadextendsThread
publicvoidrun()
{
while(true)
br=newBufferedReader(newInputStreamReader(s.getInputStream()));
StringS=br.readLine();
System.out.println(S);
Stringstr[];
str=S.split("
if(str[0].equals("
))
if(str[1].equals("
正确"
{
f.setVisible(false);
newhaoyoujiemian();
newC(str[2],str[3]);
elseif(str[1].equals("
错误"
{
username.setText("
password.setText("
JOptionPane.showMessageDialog(null,"
账号或密码输入错误"
Y"
a2.setVisible(false);
修改成功"
N"
jtf1.setText("
jtf2.setText("
jtf3.setText("
jtf4.setText("
JOptionPane.showMessageDialog(null,