WebSocket干貨-2 實現1對1聊天 離線消息


上篇文章已實現基礎的群聊功能  將收到的信息轉發到所有人。

  先隨便聊一下

  首先是 實現思路  一開始是想把WebSocket對象整個賽進Redis中 但是遇見了問題    WebSocket無法反序列化 因此無法存進Redis。  所以只能繼續用CopyOnWriteArraySet對付使用了.(在想到更好的解決方案之前可能要一直用他了)

  首先最先要處理的是 OnMessage 注解下的OnMessage方法     其中有這樣一個參數String Message  收到的包     ----我們在這里改裝下  前端發包的時候發JSON字符串

  {  

  type:"類型"

  conent:“內容”

  sid:"發送的目標Id"

  tid:"您自己的id"

 }  

   根據這個json 我們就可以去CopyOnWriteArraySet取得目標用戶的Session 然后對他發送消息 sendText;

  至此 1 - 1的聊天就實現了

  之后就是離線消息

  同上如果在CopyOnWriteArraySet中娶不到sid對應的session 那就說明用戶不存在Or離線

  那我們就把該條消息存入Redis  中

    在用戶連接進入時 @Onopen注解下的Onopen方法

    根據用戶的sid判斷是否有離線消息

     如果有 返送給用戶  同時刪除Redis中未讀消息的緩存

 

貼代碼

  

    /**
     * 數據處理中心
     *
     * @param message
     * @param session
     */
    @OnMessage
    public void OnMessage(String message, Session session) {
        if (isMessageType(message) == -1) {
            log.error("消息來源異常 ---- 消息來源ID" + this.sid);
            return;
        } else if (isMessageType(message) == 0) {
            sendMsgBach(message);
        } else if (isMessageType(message) == 1) {
            //處理1對1消息  當前收到消息來源session
            sendMsg(message, session);
        }
        
    }
  
/** * 判斷消息類型 為公開消息 還是私有消息 */ public Integer isMessageType(String msg) { JSONObject jsonObject = JSONObject.parseObject(msg); Integer type = jsonObject.getInteger("type"); if (type == 1) { return 1; } else if (type == 0) { return 0; } else { return -1; } }
 /**
     * @param messagem 消息
     */
    public void sendMsg(String messagem, Session session) {

        Boolean sign = false;
        JSONObject jsonObject = JSONObject.parseObject(messagem);
        String sid = jsonObject.getString("sid");
        System.out.println("當前用戶id:" + this.sid);
        System.out.println("目標用戶id:" + sid);
        //先給發送端返回發送的消息
        try {
            session.getBasicRemote().sendText(messagem);
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (WebSocketServer iserver : webSocketSet) {
            if (sid.equals(iserver.sid)
            ) {
                try {
                    iserver.session.getBasicRemote().sendText(messagem);
                    sign = true;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //處理未成功發送的消息
        if (sign == false) {
            BoundListOperations boundListOperations = redisTemplate.boundListOps("unread:" + sid);
            String content = (String) jsonObject.get("content");
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM-dd HH:mm:ss");
            String format = simpleDateFormat.format(new Date());
            content="離線消息 - "+format+"  "+content;
            jsonObject.put("content",content);
            boundListOperations.leftPush(jsonObject.toJSONString());
        }

    }

 

   

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM