日期:2014-05-20  浏览次数:20822 次

客户端在线每隔整点给积分如何设计
客户端在线每一小时赠送1积分,不足一整小时不给积分。

请问这种c/s 如何设计,对应的数据库结构又应该怎么设计?

目前客户端可以主动定时向服务器发出在线的信息。

希望大家能给我些思路,谢谢!



------解决方案--------------------
客户登录记下时间,如果能在客户端计时更好,否则每隔一定时间客户端发在线信息,到一小时无客户信息视为不在线,清空不送分。
------解决方案--------------------
保持“心跳”式通讯,服务器端记录客户端连续有回复的时间,不不到一小时断掉,时间归零,到一小时归零加积分继续计时。
------解决方案--------------------
谢谢happytonice
因为安全因素,这个计时的功能不想放到客户端去做。
目前的设计是这样的:

有一个在线表,主要字段有三个:客户端编号,上线时间,离线时间。

客户端上线时,会把当前时间计入上线时间;客户端一定时间内不发出请求,会认为客户端离线,将当前时间计入客户端离线时间。

积分就是通过计算这两者时间差来算。
------解决方案--------------------
这些算法设计都不是大问题。
我感觉最重要的是这个“连接状态”。把这个状态处理好,问题就不大了
------解决方案--------------------
OnLineStatus和OnLineStatusLog, 用户登录时,记录时间,并开启心跳作业, 每隔10s(自定义),对在线客户端进行轮询, 如果总时长〉1小时,并且心跳次数符合条件, 则送积分并将送掉的时长和心跳减掉放进log表,否则,更新最近登录登出时间、在线状态、心跳次数、总在线时长。


相同结构的两个表
OnLineStatus 
OnLineStatusLog
字段
uid guid 自增主键
userid
username
lastlogintime 最近登录
lastlogouttime 最近登出
sumspan 总在线时长
connectid 会话id
ip
mac
area
addr
heartbeat 心跳次数

------解决方案--------------------
探讨
谢谢happytonice
因为安全因素,这个计时的功能不想放到客户端去做。
目前的设计是这样的:

有一个在线表,主要字段有三个:客户端编号,上线时间,离线时间。

客户端上线时,会把当前时间计入上线时间;客户端一定时间内不发出请求,会认为客户端离线,将当前时间计入客户端离线时间。

积分就是通过计算这两者时间差来算。