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) --- 登陆后显示历史消息的主要内容,如果未能解决你的问题,请参考以下文章
freeradius+daloradius不显示在线用户,不能查询登陆历史