Java即时聊天程序.docx
- 文档编号:25942476
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:24
- 大小:916.79KB
Java即时聊天程序.docx
《Java即时聊天程序.docx》由会员分享,可在线阅读,更多相关《Java即时聊天程序.docx(24页珍藏版)》请在冰豆网上搜索。
Java即时聊天程序
Java即时聊天程序
2018年12月10日
难度系数
独立完成工作量占总工作量的比例
90%
程序功能完成情况
报告内容与格式
总评成绩
一、
课程题目
实现一个Java版即时聊天程序。
【功能提示】
1)用户登录及登录验证:
用户能够使用固定帐号(帐号程序内置即可,无需完成额外的注册功能)登录系统,系统能对预定的帐号、密码进行验证;
2)聊天功能:
能够在两台以上的机器上登录运行程序,能使用不同帐号完成在线的即时消息发送(聊天);
3)文件传输;
4)好友管理:
能够显示好友列表,并能够添加、修改、删除好友;
5)在线、离线状态显示:
能够显示好友的在线状态或离线状态。
6)聊天记录管理:
能够以文件或数据库形式将聊天记录进行存储,并能打开、显示、删除所存储的聊天记录。
补充:
其它可选的还包括Java多人在线网络聊天室、B/S结构的聊天系统等。
二、题目分析与设计
1.程序所使用的开发环境有:
eclipsejavaEE、jdk1.8、mysql5.7
2.软件功能架构图如下:
3.论述界面设计过程,指出其设计上的创意及组件的布局策略。
本程序一共包含5个界面:
(1)登录界面:
组件有两个标签、一个文本输入框、一个密码输入框以及两个按钮,界面的布局管理器为空,各组件的位置通过设置其坐标点来确定。
(2)注册界面:
组件有三个标签、一个文本输入框、两个密码输入框以及两个按钮,界面的布局管理器为空,各组件的位置通过设置其坐标点来确定。
(3)主页:
主页是继承了JFrame类,采用默认的边界布局,由panelNorth面板、jtp(选项卡)两部分组成:
panelNorth面板位于边界布局的北边,采用从左到右的流式布局,里面放了一个由头像和用户id组成的标签;
jtp(选项卡)位于边界布局的中部,它的第一格窗也是采用边界布局,第一个格窗由3个部分组成,由上到下是panel_1(北边)、scroll(中部)、panel_2(南边)。
其中panel_1采用居中的流式布局,存放“刷新好友列表”的按钮;scroll放了一个表格JTabel,用来显示好友列表,表格可滚动,右键点击好友可删除,双击可进入与该好友的聊天窗口;panel_2采用表格布局管理器,放了三个按钮。
主页右上角的×设置为点击退出程序。
(4)聊天窗口:
该窗口继承JFrame类,定义panel替换Jframe的默认面板,panel采用居中的流式布局,里面包含两部分内容:
可滚动的文本区域和一个面板,面板里边从左到右装了一个文本输入框和三个按钮。
(5)展示聊天历史记录页面:
该类也是继承JFrame,利用DefaultTableModel表格模型创建可滚动的表格,用来展示聊天记录。
双击聊天记录可删除该记录。
4.本系统设计了3个表,分别对应三个实体类:
用户、好友关系、聊天记录。
用户表(user)
列名
数据类型(长度)
默认
非空
自增
约束条件
备注
id
int(9)
是
主键
用户账号
password
varchar(16)
是
登录密码
status
int
(2)
0
登录状态
好友关系表(relation)
列名
数据类型(长度)
默认
非空
自增
约束条件
备注
id
int(11)
是
是
主键
user
int(11)
外键
用户的账号
friend
int(11)
外键
好友的账号
聊天记录表(record)
列名
数据类型(长度)
默认
非空
自增
约束条件
备注
id
int(11)
是
是
主键
message
varchar(200)
发送信息
from_id
int(11)
外键
发送者账号
to_id
int(11)
外键
接收者账号
time
datetime
发送时间
三个表的关联如下图:
5.系统主要分为以下几大模块:
(1)登录验证模块
执行Login类(系统的入口main函数在这里),绘制出登录界面,内部类MyActionListener监听“登录”和“注册”两个按钮。
当用户输入登录信息(账号+密码)点击登录按钮时,监听器获取输入信息,先进行正则表达式验证,格式无误后再调用userDao类,连接数据库,对登录进行验证,验证正确则跳转到Homepage类,并关闭原来的界面;当验证失败就会停留在Login界面,并弹出信息错误提示框;当用户点击注册按钮,程序会跳转到Register类,并关闭原来的界面。
执行示意图如下:
(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->服务器),服务器端接收到信息后,解读信息,得到该信息的接收者账号客户端B,写入指定客户端B的输出流(服务器->客户端B)。
客户端B的ClientThread实例接收来自服务器的信息后,处理过后再显示在客户端B的聊天窗口中。
流程如图:
(4)文件传输模块
执行流程大概如下:
Chating类继承JFrame用来描绘聊天窗口,内部类MyListener监听传输文件按钮。
当客户端A点击传输文件按钮,打开本地文件目录,选择文件,实例化文件输入流读取文件内容,然后包装读取到的内容并写入客户端A的输出流(客户端A->服务器)。
服务器端接收到信息后,解读信息,得到该信息的接收者账号客户端B,先发送系统信息告诉B准备接收文件,然后B端会弹出窗口提示输入文件的存储路径,再将文件内容写入客户端B的输出流(服务器->客户端B)。
这样客户端B的ClientThread实例接收来自服务器的文件内容后,再将内容写入到自己指定的文件路径里。
流程如图:
(5)好友管理模块
在主页Homepage类中会调用MyFriendList类,通过表格模型绘制好友列表。
MyFriendList类的内部类MyListener实现监听器监听表格,当双击表格某一行的时候就会打开与该行好友的聊天窗口,当右键单击的时候会弹出对话框询问是否确定删除该好友。
在Homepage类中还有刷新好友列表、添加好友和删除好友这三个按钮,由Homepage类的内部类MyListener进行监听。
当点击刷新好友列表按钮时,会重新连接数据库,调用RelationDao类、userDao类向数据库中查询好友列表成员及好友的最新登录状态;当点击添加好友按钮时会弹出输入框,提示输入要添加的好友账号,先用正则判断输入,再连接数据库,调用UserDao类查询是否有该用户,再RelationDao类判断是否已经是自己的好友,如果都满足条件,再调用RelationDao类向数据库插入数据,最后弹出框提示添加好友成功;当点击删除好友按钮,与添加好友类似,先正则判断输入,再连接数据库判断是否是自己的好友,如果是则调用RelationDao类删除好友关系,最后弹出框提示删除好友成功。
流程如图:
(6)登录状态模块
当用户登录成功进入主页时,在Homepage类的构造器中调用UserDao类的chang(intid)方法,连接数据库,修改用户的登录状态为在线,调用Server类中的HashMap,添加用户账号和对应输出流;当用户点击主页中的退出按钮时,内部类MyListener实现监听,调用Server类中的HashMap,移除用户账号和对应输出流,然后再次连接数据库,调用UserDao类的chang(intid)方法,修改用户的登录状态为离线。
流程如图:
(7)聊天记录模块
在Chating类描绘的聊天窗口中,内部类MyListener监听查询聊天历史记录按钮。
当点击该按钮时,实例化ChatRecord类,ChatRecord类继承JFrame类,连接数据库,调用RecordDao类查询记录,以表格形式展现聊天记录。
ChatRecord类的内部类MyListener监听表格,当双击表格的时候会弹出提示框询问是否要删除该聊天记录。
流程如图:
三、测试分析
1.
(1)本程序导入了JavaSE-1.8、mysql-connector-java-5.1.46-bin.jar这两个扩展包,其中JavaSE-1.8是创建项目时自动导入,mysql-connector-java-5.1.46-bin.jar是通过点击项目右键|Properties|JavaBuildPath|Libraries|AddexternalJARs…进行添加。
(2)数据库是借用SQLyog图形化工具创建的,数据库配置说明:
数据库
mysql
数据库服务器
localhost
端口
3306
用户名
root
密码
123456
数据库名
chat
(数据库已经导出为chat.sql文件,放在.//src//chat.sql中)
2.典型测试数据的构建,并且给出测试数据的预计结果。
(1)登录模块:
预计系统会根据用户的非法输入弹出提示,当用户输入成功验证通过后跳转到主页。
(2)注册模块
预计系统会根据用户的非法输入弹出提示,当用户注册成功验证通过后跳转到登录页面。
(3)聊天模块
预计两个客户端的聊天窗口可以即时接收和显示聊天信息。
(4)文件传输模块
预计接收端会弹出对话框提示输入保存文件路径,接收成功会在窗口上显示“接收文件成功”。
(5)查看聊天记录模块
预计会以表格显示聊天记录,双击删除聊天记录
(6)好友管理列表模块及登录状态模块
预计删除好友、添加好友成功
3.本程序的测试情况,与预计结果作对比。
注意:
首先要点击Server类启动服务器
(1)登录模块
根据用户的非法输入做出提示:
登录成功时提示如下
点击确定跳转到主页
测试情况与预计结果一致。
(2)注册模块
根据用户非法输入会有如下提示:
注册成功时提示如下:
点击确定跳转回登录界面
测试情况与预计结果一致。
(3)聊天模块
当发送信息为空时会弹出提示
测试情况与预计结果一致。
(4)文件传输模块
打开F盘,可以发现它里面多了一个abc.txt,这是通过程序接收到的,测试情况与预计结果一致。
(5)聊天记录模块
测试情况与预计结果一致。
(6)好友管理列表模块及登录状态模块
测试情况与预计结果一致
四、设计体会
(1)本来主页中好友列表是通过JLable数组绘制的,后来发现在刷新好友列表的时候,需要拖拉一下窗口才能刷新成功,比较不方便,故而改为用表格模型展现好友列表。
(2)程序为每个客户端创建了一个map容器,用来存放打开的聊天窗口和对应好友账号,这样就可以限制跟同一个好友只能打开一个聊天窗口,不可以重复打开。
但是同样由于map的存在,一旦不小心关闭了聊天窗口,就不能再次打开,必须要重新登录才能打开。
(3)如果两个人要想聊天必须要同时打开聊天窗口才能聊天成功。
程序对此作出改进,一旦用户想跟某个好友聊天,而好友没有打开聊天窗口,服务器会通知该好友提示“xxx想跟你聊天,请打开聊天窗口”。
(4)在测试过程中发现,如果用搜狗输入法向输入框分开多次输入中文时,会发出程序卡顿现象,但是改用微软拼音输入法就不会。
(5)由于一份聊天记录存放在数据库中,这个记录是两个人共享的,一旦其中一人删除了记录,另外一个人也就不能查到该记录了。
改进方法(还没实现):
将聊天记录以文件形式分别保存在各自的客户端上,这样的一方的删除不会影响到另一方。
(6)本系统还有一个不足就是分包不明确,还有没有做到很好的封装对象,特别是聊天功能模块,代码写得比较冗杂。
附录:
源代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 即时 聊天 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)