300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 韩顺平老师QQ离线消息

韩顺平老师QQ离线消息

时间:2020-07-05 03:09:18

相关推荐

韩顺平老师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());}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。