HuaXinIM聊项目优化(在线用户列表实现在线更新)

HuaXinIM项目进行了优化,实现了在线用户列表的实时更新。当用户上线或下线时,数据库会更新其在线状态,并推送给所有用户,确保客户端能即时显示最新状态。优化涉及单个、多个及所有用户登录和下线场景,提升了用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HuaXinIM聊项目今天优化了:在线用户列表的实时更新。

每当有一个用户上线或者下线,数据库就会修改用户的在线状态信息,然后再发送给每一个用户。

代码:

当用户上线就设置状态'on',下线了就设置状态'off':

	public boolean updateOn() throws Exception {
		for(int i=0;i<IMServerMain.socketThreadList.size();i++){
			String sql = "update user set online='on' where username='"
					+IMServerMain.socketThreadList.get(i).user+"';";
			UtilTemplete.update(sql);
		}
		return true;
	}
	public boolean updateOff(String user) throws Exception{
		for(int i=0;i<IMServerMain.socketThreadList.size();i++){
			String sql = "update user set online='off' where username='"
					+user+"';";
			UtilTemplete.update(sql);
		}
		return true;
	}

新用户登录后,服务器发送给所有在线用户一个新的在线用户列表:

				//更新数据后发送给其他所有的在线用户
				for(int i=0;i<IMServerMain.socketThreadList.size();i++){
					if(!IMServerMain.socketThreadList.get(i).user.equals(name)){
						ArrayList<UserDatapojo> list = new MySQLDAOimpl().querygetHistoryMsg(
								IMServerMain.socketThreadList.get(i).user);
						String msg = "<choice>null</choice>"
								+ "<username>null</username>"
								+ "<type>getNewList</type>";
						IMServerMain.socketThreadList.get(i).oos.writeUTF(msg);
						IMServerMain.socketThreadList.get(i).oos.flush();
						IMServerMain.socketThreadList.get(i).oos.writeObject(list);
						IMServerMain.socketThreadList.get(i).oos.flush();
					}
				}

有用户下线后,也要发送一个新的在线用户列表给所有用户:

<span style="white-space:pre">		</span>try {
			new MySQLDAOimpl().updateOff(this.user);//更新数据库数据
		} catch (Exception e) {
			e.printStackTrace();
		}
		IMServerMain.socketThreadList.remove(this);
		//更新数据后发送给其他所有的在线用户
		try{
			for(int i=0;i<IMServerMain.socketThreadList.size();i++){
				ArrayList<UserDatapojo> udpList = new MySQLDAOimpl().querygetHistoryMsg(
						IMServerMain.socketThreadList.get(i).user);
				String msg = "<choice>null</choice>"
						+ "<username>null</username>"
						+ "<type>getNewList</type>";
				IMServerMain.socketThreadList.get(i).oos.writeUTF(msg);
				IMServerMain.socketThreadList.get(i).oos.flush();
				IMServerMain.socketThreadList.get(i).oos.writeObject(udpList);
				IMServerMain.socketThreadList.get(i).oos.flush();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}


当用户在线列表更新后,查询数据库所有的在线用户(除了自己),然后整理成一个队列,发送给客户端,客户端实时更新。


登录的用户只有一个时:



登录两个:



登录三个:



登录四个:



下线一个用户:



又有一个用户下线:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值