5
回答
关于安卓服务端(Servlet端)心跳消息实现
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

是这样子的,客户端采用http协议发送数据到tomcat的8080端口。服务端采用servlet去写。

下面的功能个人不知道怎么去实现,因为不像socket那样连接一样,可以采用多线程去处理。

问题如下:

客户端每分钟发送一次心跳消息,服务端接收心跳消息。当服务端连续3次没有收到心跳消息后,默认该用户已经不在线,插入一条记录到学员在线状态表,把学员状态设置为离线。

举报
小小酱油
发帖于4年前 5回/695阅
共有5个答案 最后回答: 4年前
1.学员在线列表没有必要保存到数据库,用容器缓存起来即可 2.服务端记录最后心跳请求时间,超时(3分钟)后视为离线,即在线列表过滤掉超时的用户,用一个独立的线程来清理容器中的离线用户
--- 共有 4 条评论 ---
純白陰影如果是简单的程序这样做没问题,都是要考虑具体场景下的线程同步问题。如果是正式项目,建议引入一个合适的缓存框架,用缓存框架超时来处理离线问题。 4年前 回复
小小酱油回复 @純白陰影 : 朋友,独立的线程是放在servlet的构造方法里面启动吧。因为放入到service方法里面肯定不对。。。 4年前 回复
純白陰影简单的用个HashMap<String,UserInfo>就可以啦,key为用户id,value存放登陆信息,客户端心跳请求的时候就把Userinfo里的最后请求时间更新一下 4年前 回复
小小酱油容器缓存是怎样实现的哈,能具体讲解一下么 4年前 回复

其实让数据库去做挺好的,你周期不算短,压力不大

收到心跳的时候:

UPDATE <table_userinfo> set lasttime=<cur_time>,online=1 WHERE uid=<uid>;

服务端的定时检测:
UPDATE <table_userinfo> set online=0 WHERE lasttime<(cur_time-3*60);

这个与服务器端的程序关系不大,使用任何服务器端语言即可

服务器每收到客户端请求时,记录当前时间戳,然后对最新活跃时间戳小于180秒之前的用户,清理掉在线状态即可。这样就不用管客户端的时间间隔了。

我在一些基于web的即时聊天系统中,使用的就是这个方法。

如果你的这个信息是放在数据库里的话,可以用操作系统的定时,linux的crontab windows的计划任务,分钟级的可以达到

顶部