韩顺平老师QQ离线消息
生活随笔
收集整理的這篇文章主要介紹了
韩顺平老师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离线消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CCM-计传阅读树01】论文《探测新闻
- 下一篇: Geotools与OGC(一)