java学习笔记(二十八)——开发一个小项目(VMeeting3.0)

上篇文章按照较规范的产品需求文档梳理了项目的逻辑,感觉开发起来明晰了很多;挂上一篇文章java学习笔记(二十七)——开发一个小项目(VMeeting2.0)_Biangbangbing的博客-CSDN博客

这次基于上一次的开发过程,增加了:

  1. 图片传输功能
  2. 在线视频功能【功能细节待细化】
  3. 文件传输功能【部分完成,下载功能待设计】

需求文档部分升级,并进行内容功能——技术的更新:

一、用户角色描述

用户角色 用户描述
普通用户 所有使用软件的客户端
管理员 软件后台监控人员【服务器端也需要可视化界面】

二、 产品概述

1.总体流程

【ps:所有标蓝的部分都是页面。】

2.功能摘要

功能模块 主要功能点 优先级
登录 用户登录、递交个人信息给服务器;新用户注册(递交新用户token给服务器)
聊天界面 显示聊天记录(日期、用户名、对话)、具有进行文字、涂鸦板、图片、视频、在线视频、文件、聊天的功能、侧边显示消息列表(/好友列表)
消息列表 显示消息列表
好友列表 显示好友列表,好友/群申请,加群、加好友,创建群选择
个人信息设置 个人信息修改

 3.项目文档说明

server:接收客户端A的消息,然后转发给目的客户端B

  1. server:做server相关任务调度。连接查询请求的客户端——启动界面——循环监听消息。
  2. serverUI:服务器端的界面设计。
  3. serverListener:服务器端界面的监听器。
  4. serverReceiveMsg:服务器端接收客户端发送的消息。

client:多个客户端,相互发送消息但是要经过服务器端的转发

  1. client:完成一个客户端执行任务的调度。连接服务器端——启动界面——循环监听服务器端发送的消息。
  2. clientUI:客户端的界面设计。加入视频页面功能videoUI,接收视频弹出页面getVideoUI;
  3. clientListener:客户端界面对应的监听器。
  4. clientVideoCallListener:发起、接听、挂断视频通话监听器。
  5. clientReceiveMsg:客户端接收服务器端的消息。
  6. clientLoginUI:客户端登录界面+注册界面。
  7. clientLoginListener:登录监听器。
  8. clientRegisterListener:注册监听器。
  9. clientStart:客户端启动器。

配置类

  1. User:用户类。
  2. MessagePackage:消息包。
  3. MessageBuffer:服务器待发消息缓存。
  4. IOMsg_INT:字节流收发int类型。
  5. IOMsg_Str:字节流收发string类型。
  6. IOMsg_Image:字节流收发图片类型。
  7. ImageFilter:文件选择器图片过滤器。
  8. VMeetingConfig:界面大小数据配置文件。

4.用户信息设计

数据库字段 数据 数据说明
UID 账号 用户的唯一标识符,前期自行设计不允许重复;后期可以分配【int】
name 用户名 用户自行设计,可重复【string】
password 密码 用户自行设计,可重复【string】
online 在线标记 是否在线【bool】
friendList 好友列表 user数组,细节待设计
groupList 群列表 待设计
ChatHistory 聊天记录 待设计

5.消息协议

localID:自己的id【int】

targetID:对方的id【int】

dataStr:时间戳【String】

messageType:消息类型【int】

消息内容主体。

消息类型 消息发送方 接收对象 消息内容说明 消息码 回复
消息 用户 用户 文字消息 1
消息 用户 用户 涂鸦消息 2
消息 用户 用户 图片消息 10
消息 用户 用户 视频消息 11
消息 用户 用户 视频通话消息 12
消息 用户 用户 文件消息 13
操作 用户 服务器 用户离线 253
操作 用户 服务器 新用户注册 254

0 账号冲突

1 注册成功

操作 用户 服务器 用户登录 255

0 账号或密码错误

1 登录成功

2 用户已在线

【后续还会添加不同的操作和消息,以及有不同消息内容主体的设计】

三、产品特性

 1.登录页面

  • 页面路径

打开软件第一个页面。

  • 功能描述

实现用户登录/注册。【将用户登录请求消息包发送给服务器,修改服务器内用户在线信息】【用户注册是一个新页面,要搜集用户名,用户账号,密码,确认密码】

  • 技术实现细节
  1. 用户登录使用账号和密码,发送给服务器消息绑定用户于客户端socket。服务器识别数据库账户信息正确后返回给客户端。
  2. 用户注册页面必须是一个新页面,要求输入用户名,账号,密码,确认密码。客户端发起向服务器端的连接。
  3. 注册用户之后还要进入登录页面进行登录。

2.消息列表页(默认显示页)、好友列表、个人设置

  • 页面路径

成功登录之后第一个页面。

通过上面的操作栏可以选择切换显示3个页面。

  • 功能描述

将用户近期聊天记录列表按条目显示,点击条目打开聊天页面,如果没有显示为空。【条目显示:头像,用户名,消息最后时间】

将用户的新朋友申请/好友/群按条目显示,点击之后打开聊天页面。

个人设置可以修改个人信息。【用户名、密码】。

  • 技术实现细节

【待开发。】

3.聊天界面

  • 页面路径

选择好友或者消息列表之后显示的页面。

【为了先实现必要逻辑,目前登录之后会直接显示这个页面,选择聊天好友会通过左侧搜索框确定好友账号】

  • 功能描述

显示与某个好友的聊天页面。聊天页面title为:好友用户名。左侧显示本用户信息【uid,用户名】和好友信息【uid,用户名】。

右侧为聊天记录:上半截为消息记录,中间部分为工具栏【选择消息类型:文字,涂鸦,照片、视频、视频通话、文件,清空输入框,清空聊天记录】,下半截为消息输入框,消息发送键(发送键位置不好设计,目前放在功能栏里)。


以下内容重点更新不再变色: 

  • 技术实现细节
  1. 每次发送消息都按照消息协议发送信息。
  2. 当对方在线时,发送消息之后直接在双方的聊天记录同步显示消息,消息记录为:对方name/id:消息发送时间;消息内容;  如果对方不在线,服务器将消息存放在缓存中,服务器将在其上线之后把消息发给它。
  3. 优化:将对话显示放到不同侧,对方在左,本方在右。【待实现。】
  4. 优化:对于不同消息类型的支持。【文字、涂鸦板、照片、视频、视频通话、文件】。【待实现】
  5. 首先:所有消息发送都会有消息记录在本地聊天框、对方聊天框:发送方:消息发送时间;消息内容。(下面单独具体分析消息内容如何显示)
  6. 文字:设置文字输入框为JTextArea(JTextField)类型,输入文字。点击发送键。
  7. 功能键:
  • 发送:将输入框内的文字作为消息内容显示在本聊天框的显示界面,并将输入框清空。
  • 涂鸦:弹出涂鸦板进行对话。【目前未实现涂鸦板,而是设置单独涂鸦区域用于涂鸦交流】
  • 图片:点击打开文件选择器,选择图片文件。将选择的图片绘制在本聊天框并发送给对方。因为JTextArea类型无法插入图片文件,所以无法在聊天记录显示出来,因此需要更换为JTextPane。
  • 视频:点击打开文件选择器,选择视频文件。【待实现】
  • 视频通话:点击弹出视频对话页面,点击开始键,向对方发起视频通话请求——收到接通请求,调用电脑摄像头,向对方发送视频的每帧页面,并实时显示在本视频对话页面。
  • 文件:待实现。
  • 清空:清空输入框:设置输入框的内容(JTextArea)变为""。
  • 清空聊天记录:清空聊天记录:设置聊天记录内容为""。
消息类型 发送方 服务器 接收方
1 文字 发送文字,消息显示在本聊天框 收到消息,转发消息给目标ID【遍历用户列表:在线直接发送,不在线用消息缓存器记录】。记录发送记录:时间——发送方——目标方——消息内容。(包括在线发送还是已缓存等待上线) 收到消息,将消息显示在本聊天框
2 涂鸦 —— —— ——
10 图片 用文件选择器过滤出图片信息,本地找到图片之后双击或直接选中,将图片发出,并绘制在本聊天框【用JTextPane插入icon】 收到图片消息,转发给目标ID【遍历用户列表:在线直接发送,不在线用消息缓存器记录】,记录发送记录:时间——发送方——目标方——"图片信息"。(包括在线发送还是已缓存等待上线)。 收到消息,将图片直接绘制在本聊天框。
11 视频 待开发 —— ——
12 在线视频 打开视频聊天框之后,发起视频请求12 收到视频请求,发送给目标ID。【目标方在线:直接转发请求12:1】【目标方不在线:直接发送不在线拒绝请求12:0,并将请求记录和拒绝结果发送给目标方12:0】

收到请求之后,弹出视频通话界面:

  • 如果点击接听,向对方发出接通请求12:2,调用摄像头,将本地图片绘制在视频聊天框,并发送给对方12:4;同时接收对方的视频帧,绘制在视频聊天框。
  • 拒绝之后视频页面隐藏,并发出拒绝请求12:3。
  • 收到接通请求之后,调用摄像头,将本地视频帧绘制在视频聊天框,并发送给对方12:4;接收对方的视频帧绘制在视频聊天框。
  • 收到挂断请求,12:0:提示对方不在线。
  • 收到挂断请求12:3:提示对方挂断通话。
收到接通请求之后,转发给目标ID消息记录12:2,并开始持续发送视频帧12:4;收到在线拒绝请求之后转发给目标id消息记录12:3。
点击挂断,视频页面隐藏,发起挂断请求12:3。 转发挂断请求。 收到挂断请求,提示对方挂断通话。
13 文件 —— —— ——

涂鸦板问题说明:开始想的是另弹出一个涂鸦板进行传递但是画笔传输、监听等相当复杂,目前暂时实现了划定区域显示,并发送给对方。【涂鸦按键:切换文字和涂鸦,切一次互换一次】,通过点击发送消息时识别当前模式并发送内容。

目前遇到的问题&如何解决

  1. 将收消息单独打包设置为一个线程类用于实时监控收到的信息,根据功能需求来看需要一个客户端socket需要一个监听对象帮助其收消息,二者如何协同绑定?
  2. 服务器端只能与客户端通过socket进行通讯,如何明确客户端socket对应用户的信息实现用户之间的交流?
  3. 是否应该从登录开始保持唯一一个客户端与服务器端进行通讯?如果不是,那么意味着需要重新创建client向服务器端发起连接,如何保证这么多client,都能指向一个用户;这么多client是可以同时存活的吗?而服务器端如何决策当想要给某个用户发消息时,给哪一个socket发消息,随时监控到某个用户对应的客户端socket是哪一个?
  4. 如何处理client和界面之间的传递关系?
  5. 固定并化简参数传递关系。

6. 发送图片的时候,想要将图片显示在聊天记录中,但是JTextArea只能显示、补充文字,无法显示图片:

【解决方法】

因此需要修改类型为JTextPane,但是JTextPane是将图片(ImageIcon)插入,获取的图片类型为BufferedImage,二者之间不能强转,要重新创建ImageIcon然后将BufferedImage对象作为ImageIcon构造函数的参数。

7. JTextPane没有append方法,必许要获取当前文字然后补充新的重新set,这样会出现一个问题,获取的时候无法获取到图片icon信息,每次更新照片消息将无法保存。——>?

8.照片绘制的时候是按照照片的像素大小绘制的,照片过于大,会导致占满聊天框,并不适宜观看,是否能按比例调整图片大小?

9.如何提供包括图片在内、所有文件的下载到本地功能?

10.文件类型如何展示条目?

11.在线视频如何支持在视频过程中可以接收挂断消息:

【解决方法】:

消息包内支持不同操作分类,发送每个消息的时候消息前放置标识头是什么类型消息,连续传输视频帧也每次保证保持标识头。

12.连续传输视频时是否需要反复发送消息报头?

13.视频挂断之后是否立刻将视频页关闭,还是等待手动关闭?手动关闭视频页会引起其他客户端聊天页面全部关闭,客户端进程关闭,如何实现单独关闭客户端功能页?

你可能感兴趣的:(Java学习笔记,java,视频通话,视频传输)