目录
1. 消息发送的实现方法
(注:QQ是存了大量本地数据的,所以我们的一些细节处理方法需要不一样)
经常复制粘贴的朋友应该知道,QQ的表情包是根据读取特殊编码转换出来的。所以如果想发送文字图片相间的信息,就需要给相应的图片(路径)定一个特殊的编码(如:“ \ue12f ”),之后数据库就存这段 “文字 + 编码 + 文字 + 编码 + 文字 + ......” 。
IO操作时,由于我们需要将文字按照组件(应该叫控件)或布局的方式插到一个HBox或其他布局中。因此我们需要以下数组存储存储每条信息
typeNumber (int型,存储该消息由几个部分构成,遍历整端消息,检测有多少个“ /"编码" ”和文字)
typeRecord[typeNumber + 1] (int型数组,记录每个组成的数据类型(typeNumber,1为文字 text外包一个布局,2为图片外包一个布局,统一”插入“存放 到网格布局)
text[255] (String类型数组,记录每一条读到的消息,每读一条,更新上面的两个数据。内容 为一段"text")
picture[51] (String类型数组,记录每一条读到的消息,每读一条,更新上面的两个数据。内 容为通过JDBC(编码为索引)读取的一个图片路径)
(注:要限制输入的长度,用来计算需要开辟的数组大小,text数组长度最好是与限制长度一致)
之后是整个班级信息的读取,设一个messageNumber记录有多少条消息,并把上面举例的数据全部增加一个维度,用于存储不同的组成消息
2. 消息发送思路模拟(用文字思考检测是否可行)
MySQL数据库存储
一、现在外键只存picture的编码(picture_code)和 message_id。
二、picture表
1. 存picture_id,暂时无用
2. 存picture_code *图片编码,格式“ /u / ”
(注:这里要做一个在数据库MySQL中没有找到相应编码的处理)
3. 存类型 state , 等于1为系统自带,等于2为用户上传
4. 存用户id (当state = 2时不为空)
(注:1\将所有编码按照picture_id生成,2\抄QQ的编码,个人上传的编码由id+用户名生成,3、随机生成不重复的code,用id区分用户,0是统一的表情包)
SERVER收到更新课程聊天记录的请求
一、读取20条记录,有的存message_id和相应信息,(空的存0和null)。相应信息的type为9,则为图片、文字混合消息,在message_picture表//索引//中找到信息存typeRecord【i】.
二、传//给//更新消息给客户端
CLIENT拿到数据,开始更新
一、遍历message[messageNumber + 1],每次遍历一个执行以下操作
二、遍历typeRecord【i】[typeNumber + 1] ,执行下面两个子操作:
1. 读一个text[flagT],包装插入一条Box中,flagT++ (先到Text中)
2. 读一个picture[flagP],包装插入一条Box中,flagT++ (先到imageView)
三、将Box插到提前准备好的VBox完成一条消息的插入
(注:读message[]数组要倒序读取)
3. 细节优化
1. 为了防止数据库IO操作卡顿,我们设置最大显示消息数量,设成20就行,方便演示。因为可以在后续加一个addButton,再读一遍数据(一样用page记录是第几次读20行数据)。将原来的HBox记录下来,新增一个Hbox插入到最前面,再将记录的HBox们插入。
2. ”1.“操作的MySQL需要有以下优化:
一、设置一个自动递增的主键message_id,用来记录顺序,同时可以用于查找相应的外键数据。
二、设置按照message_id排序,设置倒序排序,将message_id大的放在前面。
4. MySQL数据库varchar类型数据长度范围
MySQL数据库的varchar(字符串类型)只是默认长度为255,它的实际范围应该如下图的警告所示,可能是1 - 10485760.
5. JDBC操作数据库时千万不要用rs.setString(1,1),而是使用rs.setString(1,"your_ziduan"),这样方便直接删掉没用的字段。如果你对数据表足够自信可以用int,可能查数据库会更快。
6. 重点:项目实现的过程
1. 先实现一个Static.FXMLLoader视图接收ois.readObject(PageMessge)的消息(ThreadLibrary.EnterStudentCourse)更新视图。
2. 实现该功能的所有实时更新优化
3. 扩展该功能慢慢的加入其他数据的加载