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