韩顺平老师QQ离线消息
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离线消息相关推荐
- 韩顺平老师《一周学会Linux》视频笔记
前言: 这个教学视频使用的软件环境是: Red Hat Linux(Kernel 2.4.20-8)红帽Linux系统[release 9 shrike],在虚拟机中运行 1.成为一个Linux专家的 ...
- Java基础易忘重点内容笔记【附B站韩顺平老师课程链接】
B站课程链接:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0 1. 文档注释 用于对Java方法的注释,可据此生 ...
- 韩顺平老师讲解13个自学编程的坑
文章目录 前言 内容 误区一 不注重基础,什么技术火就学什么 误区二 总是纠结学最好的编程语言 误区三 喜欢看不喜欢动手 误区四 没有认识到,听懂和能使用时两回事 误区五 很少做笔记,也不去画思维导图 ...
- 韩顺平老师坦克大战项目总结
韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结 1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在. ...
- Java坦克大战 跟学韩顺平老师视频开发
这里写目录标题 TankBigWarGame 介绍 界面展示 项目架构 安装教程 游戏说明 项目涉及技术功能 游戏结束判断 项目不足与优化空间 相关代码展示 主方法Main 绘图界面 MyPanelF ...
- 传智播客韩顺平老师PHP入门到精通视频免费下载
传智播客韩顺平老师PHP入门到精通视频免费下载--留下邮箱Lz发送 视频介绍: PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语 ...
- Java集合深入剖析【韩顺平老师版】
Java集合知识体系[思维导图] 1.集合体系 1.1.为什么使用集合? 1.数组的不足 长度固定,不能更改 存储的必须是同一类型的元素(基本类型或引用类型) 增加.删除元素比较麻烦 2.集合的优势 ...
- 韩顺平老师讲诉如何学习PHP
有很多网友发来邮件询问各种问题,有深有浅, 有难有易.因为很多时间需要上课,没有一一回答,这里给大家道个歉,这里我举例出了几封网友的来信: 发件人:Chen Ma 发送时间: 2012-09-18 1 ...
- 韩顺平老师坦克大战优化版
一.项目介绍 1.前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化.编码上尽量按照阿里的代码规约:有非常详尽的注释:引入了线程池,线程安全集合类,原子类等:通过这个小项目的学习,可以深入地理解 ...
最新文章
- 统计123出现次数_如何使用 count 统计词条出现次数?
- 计算机程序设计vb课后题,《VB程序设计》课后题答案
- 【转】C#Socket编程详解(一)TCP与UDP简介
- mysql永远不用utf8_永远不要在 MySQL 中使用「utf8」
- 二阶龙格库塔公式推导_二阶常系数齐次线性方程通解推导(涉及常数变易法和欧拉公式)...
- 程序员的黑科技_用代码回复博客
- Spring 最常用的 7 大类注解,史上最强整理!
- 硕士研究生毕业论文书写格式总结
- java版微信调小i机器人接口说明书_java版微信调用小i机器人
- VM设置Ubuntu窗口自适应大小
- Java接口,多态,向上转型,向下转型的意义
- Elasticsearch(六)了解全文搜索
- win10照片应用打不开的解决方法
- AutoCAD在指定布局中如何隐藏指定的图形?
- 使用CStdioFile操作文件和filetxt.cpp报错和filecore.cpp报错
- 互联网,因特网和万维网的区别是什么?
- vim:vim从入门到放弃
- 大学生查重网站有哪些
- android申请悬浮窗代码,三行代码实现Android应用内悬浮窗,无需一切权限,适配所有ROM和厂商...
- Mac 使用Jad 反编译class文件