1、Message 类,增加 Arraylise<Message>属性,MessageType 类增加离线消息类型

        private ArrayList<Message> arrayList;
        String MESSAGE_OFFLINE = "10";//离线消息类型

2、发送方用户正常发送消息

3、服务器判断接收方用户是否在线,若接收方不在线,将消息存入离线服务器

i. 先建立离线数据库,并增加将离线消息存入服务器方法 addToDbServer、从离线服务器删除消息方法 deleteDbServerMes、离线服务器将离线消息发往用户方法 sendOfflineMes 和 判断用户当前是否在先方法 isOnline。

public class OfflineMes {private static ConcurrentHashMap<String, ArrayList<Message>> dbServer = new ConcurrentHashMap<>();public static ConcurrentHashMap<String, ArrayList<Message>> getDbServer() {return dbServer;}public static void setDbServer(ConcurrentHashMap<String, ArrayList<Message>> dbServer) {OfflineMes.dbServer = dbServer;}//addToDbServerpublic static void addToDbServer(String userId, Message message) {if (!dbServer.containsKey(userId)) {ArrayList<Message> messageArrayList = new ArrayList<>();messageArrayList.add(message);dbServer.put(userId, messageArrayList);} else {ArrayList<Message> messageArrayList = dbServer.get(userId);messageArrayList.add(message);}}//delete from DbServerpublic static void deleteDbServerMes(String userId) {dbServer.remove(userId);}//send offline message to getterpublic static void sendOfflineMes(String getter, ConcurrentHashMap dbServer) {ArrayList<Message> messageArrayList = (ArrayList<Message>) dbServer.get(getter);Message message = new Message();message.setMesType(MessageType.MESSAGE_OFFLINE);message.setArrayList(messageArrayList);//发送离线方法中,将离线消息Arraylist 封装到Message对象中,这样当客户端线程接收//服务器消息时可以直接判断是离线消息,从而直接按离线消息展示方式处理try {ObjectOutputStream oos = new ObjectOutputStream(ManageServerThread.getscct(getter).getSocket().getOutputStream());oos.writeObject(message);} catch (IOException e) {throw new RuntimeException(e);}}//check user is onlinepublic static boolean isOnline(String userId) {return ManageServerThread.getHm().containsKey(userId);}
}

ii.服务器线程类 ServerConnectClientThread 接收到普通消息后,判断接收用户是否在线,若不在线将离线消息加入离线服务器

if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {if (!OfflineMes.isOnline(message.getGetter())) {OfflineMes.addToDbServer(message.getGetter(), message);System.out.println("接收方不在线,消息已缓存");} else {ObjectOutputStream oos = new ObjectOutputStream(ManageServerThread.getscct(message.getGetter()).getSocket().getOutputStream());oos.writeObject(message);}
}4、服务器在接收到离线消息接收方登录系统时(在QQServer类中),将离线消息转发至接收方
if (checkUser(u.getUserId(),u.getPasswd())) {ms.setMesType(MessageType.MESSAGE_LOGIN_SUCCEED);oos.writeObject(ms);ServerConnectClientThread scct = new ServerConnectClientThread(socket, u.getUserId());scct.start();ManageServerThread.addThread(u.getUserId(), scct);System.out.println("用户登录,服务器将离线缓存消息发给用户");if(OfflineMes.getDbServer().get(u.getUserId()) != null){//判断登录用户是否有离线消息OfflineMes.sendOfflineMes(u.getUserId(),OfflineMes.getDbServer());OfflineMes.deleteDbServerMes(u.getUserId());}

5、客户端接收到离线消息类型消息时,直接拆包展示

else if(ms.getMesType().equals(MessageType.MESSAGE_OFFLINE)){ArrayList<Message> arrayList = ms.getArrayList();for(Message ms1 : arrayList){System.out.println("\n离线消息: "+ ms1.getSendTime() + "[" + ms1.getSender() +"] 对 " + "[" + ms1.getGetter() +"] 说: " + ms1.getContent());}
}

韩顺平老师QQ离线消息相关推荐

  1. 韩顺平老师《一周学会Linux》视频笔记

    前言: 这个教学视频使用的软件环境是: Red Hat Linux(Kernel 2.4.20-8)红帽Linux系统[release 9 shrike],在虚拟机中运行 1.成为一个Linux专家的 ...

  2. Java基础易忘重点内容笔记【附B站韩顺平老师课程链接】

    B站课程链接:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0 1. 文档注释 用于对Java方法的注释,可据此生 ...

  3. 韩顺平老师讲解13个自学编程的坑

    文章目录 前言 内容 误区一 不注重基础,什么技术火就学什么 误区二 总是纠结学最好的编程语言 误区三 喜欢看不喜欢动手 误区四 没有认识到,听懂和能使用时两回事 误区五 很少做笔记,也不去画思维导图 ...

  4. 韩顺平老师坦克大战项目总结

    韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结 1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在. ...

  5. Java坦克大战 跟学韩顺平老师视频开发

    这里写目录标题 TankBigWarGame 介绍 界面展示 项目架构 安装教程 游戏说明 项目涉及技术功能 游戏结束判断 项目不足与优化空间 相关代码展示 主方法Main 绘图界面 MyPanelF ...

  6. 传智播客韩顺平老师PHP入门到精通视频免费下载

    传智播客韩顺平老师PHP入门到精通视频免费下载--留下邮箱Lz发送 视频介绍: PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语 ...

  7. Java集合深入剖析【韩顺平老师版】

    Java集合知识体系[思维导图] 1.集合体系 1.1.为什么使用集合? 1.数组的不足 长度固定,不能更改 存储的必须是同一类型的元素(基本类型或引用类型) 增加.删除元素比较麻烦 2.集合的优势 ...

  8. 韩顺平老师讲诉如何学习PHP

    有很多网友发来邮件询问各种问题,有深有浅, 有难有易.因为很多时间需要上课,没有一一回答,这里给大家道个歉,这里我举例出了几封网友的来信: 发件人:Chen Ma 发送时间: 2012-09-18 1 ...

  9. 韩顺平老师坦克大战优化版

    一.项目介绍 1.前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化.编码上尽量按照阿里的代码规约:有非常详尽的注释:引入了线程池,线程安全集合类,原子类等:通过这个小项目的学习,可以深入地理解 ...

最新文章

  1. 统计123出现次数_如何使用 count 统计词条出现次数?
  2. 计算机程序设计vb课后题,《VB程序设计》课后题答案
  3. 【转】C#Socket编程详解(一)TCP与UDP简介
  4. mysql永远不用utf8_永远不要在 MySQL 中使用「utf8」
  5. 二阶龙格库塔公式推导_二阶常系数齐次线性方程通解推导(涉及常数变易法和欧拉公式)...
  6. 程序员的黑科技_用代码回复博客
  7. Spring 最常用的 7 大类注解,史上最强整理!
  8. 硕士研究生毕业论文书写格式总结
  9. java版微信调小i机器人接口说明书_java版微信调用小i机器人
  10. VM设置Ubuntu窗口自适应大小
  11. Java接口,多态,向上转型,向下转型的意义
  12. Elasticsearch(六)了解全文搜索
  13. win10照片应用打不开的解决方法
  14. AutoCAD在指定布局中如何隐藏指定的图形?
  15. 使用CStdioFile操作文件和filetxt.cpp报错和filecore.cpp报错
  16. 互联网,因特网和万维网的区别是什么?
  17. vim:vim从入门到放弃
  18. 大学生查重网站有哪些
  19. android申请悬浮窗代码,三行代码实现Android应用内悬浮窗,无需一切权限,适配所有ROM和厂商...
  20. Mac 使用Jad 反编译class文件

热门文章

  1. Vue 通过url下载文件并修改文件名称
  2. 十位艺术家告诉你Crypto和NFT为艺术带来了哪些变化
  3. 人工智能会取代人类的艺术创造力吗
  4. 达梦数据库表空间管理实例
  5. oracle 首位是字母,Oracle 10g如何对用户姓名,按首字母排序、查询
  6. JavaScript 随机生成一组手机号码
  7. Python 生成随机手机号码
  8. 2021下半年软考网络工程师上午真题(一)
  9. 在vue2中使用vue3的核心功能(渐进式升级vue版本)
  10. 安装禅道系统(开源)和配置RDS数据库