韩顺平老师QQ离线消息

news/2025/3/16 0:59:41/

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());}
}

                


http://www.ppmy.cn/news/947679.html

相关文章

若依vue -【 33 ~ 】

33 登录日志 系统管理 > 日志管理 > 登录日志 1 应用场景 统计用户的活跃度用户错误输入密码多少次 2 后台实现 &#xff08;1&#xff09;SysLoginController#login&#xff1a;登录 /*** 登录方法* * param loginBody 登录信息* return 结果*/PostMapping("/…

golang 日志库zap和日志切割实践

介绍 在许多Go语言项目中&#xff0c;我们需要一个好的日志记录器能够提供下面这些功能&#xff1a; 能够将事件记录到文件中&#xff0c;而不是应用程序控制台。 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 支持不同的日志级别。例如INFO&#xff0c;DEBUG&a…

万恶之源?

这是我第一次发布文章&#xff0c;我将分享Java后端的一些常用技术

来自鬼灭之刃迷的发表

炎柱母亲&#xff1a;知道你为什么刚生下来就比别人更强壮吗&#xff1f;那是因为上天要你用自己的天赋保护那些弱小之人。用自己的天赋欺负别人、中饱私囊。都是不允许的。 炎柱临死前&#xff1a;不管自己的懦弱和不中用&#xff0c;再怎么狠狠打击你。都要挺起胸膛&#xff…

鬼灭之刃中的人名儿

碳制郎的同期朋友&#xff0c;嘴平伊之助。 不知道是音译还是意译&#xff0c;这明明就是“嘴平一只猪”吗。 笑死&#xff0c;同时给翻译点个赞。

日本动漫作家和其部分作品

顺序按照作家出生先后 作者英文名出生日期作品藤子F不二雄 1933年12月1日哆啦A梦秋本治 1952年12月11日乌龙派出所鸟山明 1955年4月5日阿拉蕾、龙珠青山刚昌 1963年6月21名侦探柯南田尻智Tajiri Satoshi1965年8月28日精灵宝可梦井上雄彦Inoue Takehiko1967年1月12日灌篮高手武…

vol.131 日本异闻录 · 我曾经去了一个假的日本

主播 / 吕桑、朱峰 后期 / 朱峰 内容简介 这是津津乐道的一个新的节目系列&#xff0c;由吕桑给大家介绍他长居日本期间的见闻和风土人情&#xff0c;每期节目时长在30分钟以内&#xff0c;满足大家希望有一些短内容的需求。 第一期节目主要讲吕桑和日本的缘分&#xff0c;以及…

碰到了鬼!!!!

今天在测试用java操作数据库时&#xff0c;由于sqlyog的刷新太慢了&#xff0c;我就要Dos窗口取查看表里的信息来检验是否操作成功。 输入了一句 “select * from 表名” 出现了一堆的二进制。 查询了相关的解决方式之后&#xff1a;就是把数据库显示的编码格式设置成 gb2312的…