上篇文章已實現基礎的群聊功能 將收到的信息轉發到所有人。
先隨便聊一下
首先是 實現思路 一開始是想把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()); } }