韩顺平老师多用户即时通讯系统功能扩展:发送离线消息

本文详细阐述了如何在服务器端实现离线消息的存储与推送,当用户登录时接收并转发,同时在客户端处理接收到的离线消息。通过实例代码展示了如何使用ConcurrentHashMap存储离线消息,并在用户登录后确保消息传递。
摘要由CSDN通过智能技术生成

如何实现发送离线消息的功能

思路总结

服务器端思路:

先在接受客户端消息的逻辑块中,先判断接受方是否在线,将其拆分为两种情况,如果对方在线,那么由服务器将消息转发给接收方,如果对方不在线,那么将其加入到一个key为用户id,value为一个消息集合(ArrayList)的离线集合(ConcurrentHashMap)中,当用户登录时判断该用户的id是否存在于该集合的key中,如果存在,那么通过id,获取到对应的消息集合(ArrayList),通过用户id获取到对应的socket,将消息集合发送到客户端

客户端思路:

在客户端的线程中,对接受的object对象使用instance of判断其运行类型,如果为message对象,则进行之前的逻辑,如果为ArrayList对象,则遍历其中所有的message对象,取出内容并打印。

服务器端的新增代码

编写一个OffLineMessageService类 用来处理离线消息####
package qqserver.service;

import CommonServerClient.Message;
import org.junit.Test;
import sun.net.util.IPAddressUtil;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 晓宇
 * @version 1.0
 * @Time: 2022/7/14  10:31
 */
@SuppressWarnings({"all"})
public class OffLineMessageService {
    //key->getterId value->contents
    private static ConcurrentHashMap<String, ArrayList> offlineMap=new ConcurrentHashMap();

    public static ConcurrentHashMap<String, ArrayList> getOfflineMap() {
        return offlineMap;
    }

    public static void setOfflineMap(ConcurrentHashMap<String, ArrayList> offlineMap) {
        OffLineMessageService.offlineMap = offlineMap;
    }
    @Test
    public void test(){
   
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值