Java 期末考核
课程名称
Java 程序设计
题目名称
java 即时聊天程序
学生学院
计算机
专业班级
计算机 17(4)班
学
号
学生姓名
指导教师
赵锐
2018 年 12 月 10 日
1
难度系数
独立完成工作量占总工作量的比例
90%
程序功能完成情况
报告内容与格式
总评成绩
2
一、 课程题目
实现一个 Java 版即时聊天程序。
【功能提示】
1)用户登录及登录验证:用户能够使用固定帐号(帐号程序内置即可,无需完成额外的注册
功能)登录系统,系统能对预定的帐号、密码进行验证;
2)聊天功能:能够在两台以上的机器上登录运行程序,能使用不同帐号完成在线的即时消息
发送(聊天);
3)文件传输;
4)好友管理:能够显示好友列表,并能够添加、修改、删除好友;
5)在线、离线状态显示:能够显示好友的在线状态或离线状态。
6)聊天记录管理:能够以文件或数据库形式将聊天记录进行存储,并能打开、显示、删除所
存储的聊天记录。
补充:其它可选的还包括 Java 多人在线网络聊天室、B/S 结构的聊天系统等。
二、 题目分析与设计
1. 程序所使用的开发环境有:eclipse java EE、jdk1.8、mysql5.7
2.软件功能架构图如下:
3
3. 论述界面设计过程,指出其设计上的创意及组件的布局策略。
本程序一共包含 5 个界面:
(1)登录界面:组件有两个标签、一个文本输入框、一个密码输入框以及两个按钮,界面的
布局管理器为空,各组件的位置通过设置其坐标点来确定。
(2)注册界面:组件有三个标签、一个文本输入框、两个密码输入框以及两个按钮,界面的
布局管理器为空,各组件的位置通过设置其坐标点来确定。
(3)主页:主页是继承了 JFrame 类,采用默认的边界布局,由 panelNorth 面板、jtp(选项卡)
两部分组成:○1 panelNorth 面板位于边界布局的北边,采用从左到右的流式布局,里面放了
一个由头像和用户 id 组成的标签;○2 jtp(选项卡)位于边界布局的中部,它的第一格窗也是采
用边界布局,第一个格窗由 3 个部分组成,由上到下是 panel_1(北边)、scroll(中部)、panel_2
(南边)。其中 panel_1 采用居中的流式布局,存放“刷新好友列表”的按钮;scroll 放了一个
表格 JTabel,用来显示好友列表,表格可滚动,右键点击好友可删除,双击可进入与该好友
的聊天窗口;panel_2 采用表格布局管理器,放了三个按钮。主页右上角的×设置为点击退出
程序。
(4)聊天窗口:该窗口继承 JFrame 类,定义 panel 替换 Jframe 的默认面板,panel 采用居中
的流式布局,里面包含两部分内容:可滚动的文本区域和一个面板,面板里边从左到右装了
一个文本输入框和三个按钮。
(5) 展示聊天历史记录页面:该类也是继承 JFrame,利用 DefaultTableModel 表格模型创建
可滚动的表格,用来展示聊天记录。双击聊天记录可删除该记录。
4. 本系统设计了 3 个表,分别对应三个实体类:用户、好友关系、聊天记录。
用户表(user)
列名
数据类型(长度) 默认 非空 自增
约束条件 备注
int(9)
varchar(16)
int(2)
id
password
status
好友关系表(relation)
是
是
0
主键
用户账号
登录密码
登录状态
列名
id
user
friend
数据类型(长度) 默认 非空 自增
约束条件 备注
int(11)
int(11)
int(11)
是
是
主键
外键
外键
用户的账号
好友的账号
4
聊天记录表(record)
列名
数据类型(长度) 默认 非空 自增
约束条件 备注
int(11)
varchar(200)
int(11)
int(11)
datetime
id
message
from_id
to_id
time
三个表的关联如下图:
是
是
主键
外键
外键
发送信息
发送者账号
接收者账号
发送时间
5. 系统主要分为以下几大模块:
(1)登录验证模块
执行 Login 类(系统的入口 main 函数在这里),绘制出登录界面,内部类 MyActionListener
监听“登录”和“注册”两个按钮。当用户输入登录信息(账号+密码)点击登录按钮时,监
听器获取输入信息,先进行正则表达式验证,格式无误后再调用 userDao 类,连接数据库,
对登录进行验证,验证正确则跳转到 Homepage 类,并关闭原来的界面;当验证失败就会停留
在 Login 界面,并弹出信息错误提示框;当用户点击注册按钮,程序会跳转到 Register 类,
并关闭原来的界面。执行示意图如下:
5
(2)用户注册模块
在登录模块中点击注册按钮会跳转到注册模块,此时执行 Register 类,内部类
MyActionListener 监听。当用户输入注册信息点击注册按钮时,监听器获取输入信息,先进
行正则表达式验证,格式无误后再调用 userDao 类,连接数据库,向数据库插入新用户信息,
注册正确则跳回到登录模块中的 Login 类,并关闭原来的界面;当注册失败就会停留在
Register 界面,并弹出信息错误提示框;当用户点击返回按钮,程序会跳转到 Login 类,并
关闭原来的界面。执行示意图如下:
(3)聊天功能模块
服务器端是 Server 类,该类专门用来创建 socket 服务,等待客户端的连接,同时有一
个静态的 HashMap,用来记录在线的客户端账号和其对应的输出流。每当客户端发起连接的
申请时,就实例化一个 ServerThread 类线程为该客户端服务。
ServerThread 类是服务器端线程类,是信息中转站,负责接收来自客户端的信息,客户
端的传来的信息都会经过 Protocol 接口中的协议字符包装,处理后再向指定的客户端输出。
客户端是 Client 类,这个类主要是用来获取客户端对应的输出流,同时为客户端实例化
一个 ClientThread 线程类。当用户登录成功进入系统主页之后,就会启动客户端,同时发送
信息通知服务器端,然后服务器端就会把用户账号和对应的输出流放进 HashMap 中。
ClientThread 类是客户端用来接收来自服务器的信息,并将信息处理后输出到聊天界面
上。
执行流程大概如下:Chating 类继承 JFrame 用来描绘聊天窗口,内部类 MyListener 监
听发送按钮。当客户端 A 点击发送按钮,获取输入框的信息,判断信息是否为空,非空调用
RecordDao 类,连接数据库,插入聊天记录,同时将信息显示在聊天窗体中,然后包装信息
并写入客户端 A 的输出流(客户端 A->服务器),服务器端接收到信息后,解读信息,得到该
6
信息的接收者账号客户端 B,写入指定客户端 B 的输出流(服务器->客户端 B)。客户端 B 的
ClientThread 实例接收来自服务器的信息后,处理过后再显示在客户端 B 的聊天窗口中。流
程如图:
(4)文件传输模块
执行流程大概如下:Chating 类继承 JFrame 用来描绘聊天窗口,内部类 MyListener 监
听传输文件按钮。当客户端 A 点击传输文件按钮,打开本地文件目录,选择文件,实例化文
件输入流读取文件内容,然后包装读取到的内容并写入客户端 A 的输出流(客户端 A->服务
器)。服务器端接收到信息后,解读信息,得到该信息的接收者账号客户端 B,先发送系统信
息告诉 B 准备接收文件,然后 B 端会弹出窗口提示输入文件的存储路径,再将文件内容写入
客户端 B 的输出流(服务器->客户端 B)。这样客户端 B 的 ClientThread 实例接收来自服务
器的文件内容后,再将内容写入到自己指定的文件路径里。流程如图:
7
(5)好友管理模块
在主页 Homepage 类中会调用 MyFriendList 类,通过表格模型绘制好友列表。MyFriendList
类的内部类 MyListener 实现监听器监听表格,当双击表格某一行的时候就会打开与该行好友
的聊天窗口,当右键单击的时候会弹出对话框询问是否确定删除该好友。在 Homepage 类中
还有刷新好友列表、添加好友和删除好友这三个按钮,由 Homepage 类的内部类 MyListener
进行监听。当点击刷新好友列表按钮时,会重新连接数据库,调用 RelationDao 类、userDao
类向数据库中查询好友列表成员及好友的最新登录状态;当点击添加好友按钮时会弹出输入
框,提示输入要添加的好友账号,先用正则判断输入,再连接数据库,调用 UserDao 类查询
是否有该用户,再 RelationDao 类判断是否已经是自己的好友,如果都满足条件,再调用
RelationDao 类向数据库插入数据,最后弹出框提示添加好友成功;当点击删除好友按钮,与
添加好友类似,先正则判断输入,再连接数据库判断是否是自己的好友,如果是则调用
RelationDao 类删除好友关系,最后弹出框提示删除好友成功。流程如图:
(6)登录状态模块
当用户登录成功进入主页时,在 Homepage 类的构造器中调用 UserDao 类的 chang(int id)
方法,连接数据库,修改用户的登录状态为在线,调用 Server 类中的 HashMap,添加用户账
号和对应输出流;当用户点击主页中的退出按钮时,内部类 MyListener 实现监听,调用 Server
类中的 HashMap,移除用户账号和对应输出流,然后再次连接数据库,调用 UserDao 类的
chang(int id)方法,修改用户的登录状态为离线。流程如图:
8