19年10月份周报(一)

文章目录

  • 1. 前言
  • 2. 主要完成任务
    • 2.1 10月1日
    • 2.2 10月2日
    • 2.3 10月3日
    • 2.4 10月4日
    • 2.5 10月5日
    • 2.6 10月6日
    • 2.7 10月7日
  • 3. 学习总结

1. 前言

时间:19年10月1日—19年10月7日
主要完成任务:Swing的学习+基于C/S架构的多人聊天室

2. 主要完成任务

2.1 10月1日

详细的学习了Swing的组件:

  1. 主要学习了JFrame、JLabel、JPanel、JButton、JTextField、JPasswordField、JTabbedPane、JCheckBox、JScrollPane、JTextArea常用的Swing类。
  2. 以及常用的布局管理器:
    流式布局管理器(FlowLayout)、边界布局管理器(BorderLayout)、网格布局管理器(GridLayout)、卡片布局管理器(GardLayout)、网格包布局管理器(GridBagLayout)

总结了Swing的编程流程:

  1. 继承JFrame
  2. 定义所需要的组件
  3. 创建组件(构造函数)
  4. 设置布局管理器
  5. 添加组件
  6. 对窗体进行设置
  7. 显示窗体

2.2 10月2日

初步规划了开发步骤:

  1. 把登录界面,好友界面,聊天界面设计出来并写好。
  2. 当用户点击登录后,把账号、密码发送给服务器去验证。
  3. 设置聊天协议和多人聊天室的时序图
  4. 完成好友互聊天功能,服务器可以完成信息的转发
  1. 把服务器得到的每个Socket和客户端保存在HashMap,用客户端的Id标识该Socket
  2. 当服务器和某个客户端形成一个连接时,客户端和服务器端单开一个线程,保持通讯
  1. 好友在线为彩色头像,下线或离线为暗色头像

设计思路:当用户登录成功后,就向服务器发送一个请求,要求返回在线用户的包,服务器返回一个在线用户包;当用户下线时,以该用户Id在管理线程类中讲用户移除(即将用户移除出HashMap),然后服务器发送数据包通知在线的其他用户更新好友在线列表

  1. 实现多人聊天
  2. 优化程序、提高代码复用性、降低耦合度。

2.3 10月3日

按照规定的开发步骤,首先设计了各个UI图,并用Swing逐个实现,实现效果图如下:
服务器:
19年10月份周报(一)_第1张图片
服务器管理用户:
19年10月份周报(一)_第2张图片
客户端登录页面:
19年10月份周报(一)_第3张图片
注册页面:
19年10月份周报(一)_第4张图片
好友列表:
19年10月份周报(一)_第5张图片
私聊:
19年10月份周报(一)_第6张图片
群聊:
19年10月份周报(一)_第7张图片

2.4 10月4日

初步设计了多人聊天室的时序图,如下所示:
19年10月份周报(一)_第8张图片
包传输协议设计:

协议形式 发送端 功能
messageSucceed 服务器 登录成功
messageFail 服务器 登录失败
messageComm 客户端、服务器 普通消息
messageGetOnLineFriend 客户端 请求在线好友
messageRetOnLineFriend 服务器 返回在线好友
messageAll 客户端、服务器 群发消息
messageLogoff 服务器 客户端下线包

消息内容协议设计:

消息内容 功能
mesType 用户指定消息协议类型
sendTime 发送时间
sender 发送人
getter 接收人
con 消息内容

2.5 10月5日

完成了整体的设计,程序架构图:
19年10月份周报(一)_第9张图片
项目流程图:
19年10月份周报(一)_第10张图片

2.6 10月6日

完成程序调优、降低耦合度,由于之前为了快速开发,很多业务操作都放在了界面部分,这是不合理的,所以分别做了如下三步改进:

  1. 初始模型:所有的业务逻辑和数据库操作全部写在一起
    19年10月份周报(一)_第11张图片
  2. 发现问题,界面和操作放在一起,代码复用性太差!
    19年10月份周报(一)_第12张图片
  3. 为了降低代码耦合度,分离出DAO层:
    19年10月份周报(一)_第13张图片

2.7 10月7日

代码调试、完成项目报告,进行总结、回顾。

3. 学习总结

遇到的问题以及解决方案

  1. JVM内存泄漏
    最初设计程序的时候在方法里声明了很多UserModel对象,随着引用的失效,导致GC在释放堆内存的资源时,因无法找到其引用而无法释放相应的资源,造成内存的浪费,从而导致内存泄漏。
    **解决方案:**将引用声明为域变量,这样栈中变只有一个引用,再释放资源时就不会出现因找不到引用而出现堆中的资源无法释放的情况。

  2. 程序耦合度过高
    最初设计程序的时候,由于把很多与数据库的操作直接写在了按钮响应函数或鼠标响应函数里面,导致代码重复度高,耦合性强。
    **解决方案:**通过不停的优化改进代码,使得代码更加的oo,最终将耦合度过高的程序框架分解为三层:界面、业务逻辑、DAO层。

  3. 遇到的问题以及解决方案

  4. JVM内存泄漏
    最初设计程序的时候在方法里声明了很多UserModel对象,随着引用的失效,导致GC在释放堆内存的资源时,因无法找到其引用而无法释放相应的资源,造成内存的浪费,从而导致内存泄漏。
    解决方案:将引用声明为域变量,这样栈中变只有一个引用,再释放资源时就不会出现因找不到引用而出现堆中的资源无法释放的情况。

  5. 程序耦合度过高
    最初设计程序的时候,由于把很多与数据库的操作直接写在了按钮响应函数或鼠标响应函数里面,导致代码重复度高,耦合性强。
    解决方案:通过不停的优化改进代码,使得代码更加的oo,最终将耦合度过高的程序框架分解为三层:界面、业务逻辑、DAO层。

总结:通过本周的学习,提高了自己的编程能力,初步学会了如何开发C/S架构,可以熟练的使用Swing组件,加深了对网络编程的了解,对面向对象有了进一步的理解。

你可能感兴趣的:(研究生岁月)