1. 前言
时间:19年10月1日—19年10月7日
主要完成任务:Swing的学习+基于C/S架构的多人聊天室
2. 主要完成任务
2.1 10月1日
详细的学习了Swing的组件:
- 主要学习了JFrame、JLabel、JPanel、JButton、JTextField、JPasswordField、JTabbedPane、JCheckBox、JScrollPane、JTextArea常用的Swing类。
- 以及常用的布局管理器:
流式布局管理器(FlowLayout)、边界布局管理器(BorderLayout)、网格布局管理器(GridLayout)、卡片布局管理器(GardLayout)、网格包布局管理器(GridBagLayout)
总结了Swing的编程流程:
- 继承JFrame
- 定义所需要的组件
- 创建组件(构造函数)
- 设置布局管理器
- 添加组件
- 对窗体进行设置
- 显示窗体
2.2 10月2日
初步规划了开发步骤:
- 把登录界面,好友界面,聊天界面设计出来并写好。
- 当用户点击登录后,把账号、密码发送给服务器去验证。
- 设置聊天协议和多人聊天室的时序图
- 完成好友互聊天功能,服务器可以完成信息的转发
- 把服务器得到的每个Socket和客户端保存在HashMap,用客户端的Id标识该Socket
- 当服务器和某个客户端形成一个连接时,客户端和服务器端单开一个线程,保持通讯
- 好友在线为彩色头像,下线或离线为暗色头像
设计思路:当用户登录成功后,就向服务器发送一个请求,要求返回在线用户的包,服务器返回一个在线用户包;当用户下线时,以该用户Id在管理线程类中讲用户移除(即将用户移除出HashMap),然后服务器发送数据包通知在线的其他用户更新好友在线列表
- 实现多人聊天
- 优化程序、提高代码复用性、降低耦合度。
2.3 10月3日
按照规定的开发步骤,首先设计了各个UI图,并用Swing逐个实现,实现效果图如下:
服务器:
服务器管理用户:
客户端登录页面:
注册页面:
好友列表:
私聊:
群聊:
2.4 10月4日
初步设计了多人聊天室的时序图,如下所示:
包传输协议设计:
协议形式 | 发送端 | 功能 |
---|---|---|
messageSucceed | 服务器 | 登录成功 |
messageFail | 服务器 | 登录失败 |
messageComm | 客户端、服务器 | 普通消息 |
messageGetOnLineFriend | 客户端 | 请求在线好友 |
messageRetOnLineFriend | 服务器 | 返回在线好友 |
messageAll | 客户端、服务器 | 群发消息 |
messageLogoff | 服务器 | 客户端下线包 |
消息内容协议设计:
消息内容 | 功能 |
---|---|
mesType | 用户指定消息协议类型 |
sendTime | 发送时间 |
sender | 发送人 |
getter | 接收人 |
con | 消息内容 |
2.5 10月5日
完成了整体的设计,程序架构图:
项目流程图:
2.6 10月6日
完成程序调优、降低耦合度,由于之前为了快速开发,很多业务操作都放在了界面部分,这是不合理的,所以分别做了如下三步改进:
- 初始模型:所有的业务逻辑和数据库操作全部写在一起
- 发现问题,界面和操作放在一起,代码复用性太差!
- 为了降低代码耦合度,分离出DAO层:
2.7 10月7日
代码调试、完成项目报告,进行总结、回顾。
3. 学习总结
遇到的问题以及解决方案
-
JVM内存泄漏
最初设计程序的时候在方法里声明了很多UserModel对象,随着引用的失效,导致GC在释放堆内存的资源时,因无法找到其引用而无法释放相应的资源,造成内存的浪费,从而导致内存泄漏。
**解决方案:**将引用声明为域变量,这样栈中变只有一个引用,再释放资源时就不会出现因找不到引用而出现堆中的资源无法释放的情况。 -
程序耦合度过高
最初设计程序的时候,由于把很多与数据库的操作直接写在了按钮响应函数或鼠标响应函数里面,导致代码重复度高,耦合性强。
**解决方案:**通过不停的优化改进代码,使得代码更加的oo,最终将耦合度过高的程序框架分解为三层:界面、业务逻辑、DAO层。 -
遇到的问题以及解决方案
-
JVM内存泄漏
最初设计程序的时候在方法里声明了很多UserModel对象,随着引用的失效,导致GC在释放堆内存的资源时,因无法找到其引用而无法释放相应的资源,造成内存的浪费,从而导致内存泄漏。
解决方案:将引用声明为域变量,这样栈中变只有一个引用,再释放资源时就不会出现因找不到引用而出现堆中的资源无法释放的情况。 -
程序耦合度过高
最初设计程序的时候,由于把很多与数据库的操作直接写在了按钮响应函数或鼠标响应函数里面,导致代码重复度高,耦合性强。
解决方案:通过不停的优化改进代码,使得代码更加的oo,最终将耦合度过高的程序框架分解为三层:界面、业务逻辑、DAO层。
总结:通过本周的学习,提高了自己的编程能力,初步学会了如何开发C/S架构,可以熟练的使用Swing组件,加深了对网络编程的了解,对面向对象有了进一步的理解。