Web在线聊天室(11) --- 登陆后显示历史消息

Posted 满眼*星辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web在线聊天室(11) --- 登陆后显示历史消息相关的知识,希望对你有一定的参考价值。

登陆后显示历史消息

服务器端onOpen方法

    @OnOpen
    public void onOpen(@PathParam("userId") Integer userId, Session session) throws IOException {
        // 1.把每个客户端的session都保存起来,之后转发消息到所有客户端要用
        MessageCenter.addOnlineUser(userId,session);
        // 2.查询本客户端(用户)上次登录前的消息(数据库查)
        List<Message> list = MessageDao.queryByLastLogout();
        // 3.发送当前用户在上次登录后的消息
        for (Message m : list) {
            session.getBasicRemote().sendText(Util.serialize(m));
        }
        System.out.println("建立连接" + userId);
    }

服务器端onError方法

    @OnError
    public void onError(@PathParam("userId") Integer userId, Throwable throwable) {
        System.out.println("出错了");
        //和关闭连接的操作一样
        MessageCenter.delOnlineUser(userId);
        throwable.printStackTrace();
    }

查询上次登录后的所有消息

    public static List<Message> queryByLastLogout(int userId) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        //定义返回数据
        List<Message> list = new ArrayList<>();
        try {
            //1. 获取数据库连接Connection
            connection = Util.getConnection();
            //2. 通过Connection+sql 创建操作命令对象Statement
            String sql = "select m.*,u.nickName from message m join user u on u.userId=m.userId where m.sendTime>(select lastLogout from user where userId=?)";
            statement = connection.prepareStatement(sql);
            statement.setInt(1,userId);
            //3. 执行sql:执行前替换占位符
            resultSet = statement.executeQuery();
            //如果是查询操作,处理结果集
            if (resultSet.next()) {//移动到下一行,有数据返回true
                Message message = new Message();
                //获取结果集字段,设置对象属性
                message.setUserId(userId);
                message.setNickName(resultSet.getString("nickName"));
                message.setContent(resultSet.getString("content"));
                message.setChannelId(resultSet.getInt("channelId"));
                list.add(message);
            }
            return list;
        }catch (Exception e) {
            throw new AppException("查询用户[" + userId +"]的历史消息出错", e);
        }finally {
            //释放资源
            Util.close(connection,statement,resultSet);
        }
    }

websocket服务器端关闭连接操作

在关闭连接的时候,需要把用户最后登录时间修改为当前时间后,关闭连接

    @OnClose
    public void onClose(@PathParam("userId") Integer userId) {
        //1.本客户端关闭连接,要在之前保存的session集合中,删除
        MessageCenter.delOnlineUser(userId);
        //2.建立连接要获取用户上次登录以后的消息,所以关闭长连接就是代表用户退出
        //更新用户的上次登录时间
        int n = UserDao.updateLastLogout(userId);
        System.out.println("关闭连接");
    }

实现效果

1.两位用户进同一个房间

用谷歌浏览器登录阿星的账号,进入娱乐八卦的房间
在这里插入图片描述

用谷歌浏览器登录阿星的账号,进入娱乐八卦的房间

2.互发消息
在这里插入图片描述
在这里插入图片描述
都可以相互收到消息

3.此时退出登录阿库,阿星再发消息

退出登录阿库
在这里插入图片描述
阿星再发消息
在这里插入图片描述

4.登录阿库账号,可以收到历史消息
在这里插入图片描述

以上是关于Web在线聊天室(11) --- 登陆后显示历史消息的主要内容,如果未能解决你的问题,请参考以下文章

Web聊天室项目

freeradius+daloradius不显示在线用户,不能查询登陆历史

javaEE在web页面实现在线聊天功能。

电脑Qt助手登陆后老是显示无法连接到服务器为啥

java在线聊天项目1.2版 ——开启多个客户端,分别实现数据库注册和登录功能后,成功登陆则登录框消失,好友列表窗出现

java在线聊天项目1.3版 ——设计好友列表框功能