关于安卓服务端(Servlet端)心跳消息实现

小小酱油 发布于 2013/09/13 10:04
阅读 724
收藏 0

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

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

问题如下:

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

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

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

收到心跳的时候:

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

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

0
小小酱油
小小酱油
朋友,关键是服务端的定时检测 不好处理
0
月影又无痕
月影又无痕

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

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

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

0
Frank_mc
Frank_mc

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

返回顶部
顶部