如何实现发送离线消息的功能
思路总结
服务器端思路:
先在接受客户端消息的逻辑块中,先判断接受方是否在线,将其拆分为两种情况,如果对方在线,那么由服务器将消息转发给接收方,如果对方不在线,那么将其加入到一个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(){