上篇文章已实现基础的群聊功能 将收到的信息转发到所有人。
先随便聊一下
首先是 实现思路 一开始是想把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()); } }