uoj
uoj copied to clipboard
当网络延时严重时,UOJ 倒计时不准
服务器把“需要倒计时多长时间”给传过来,但网络延时比较严重时就会导致客户端收到的时候已经晚了。。 作为比赛结束的倒计时出现时,可能导致选手未能及时提交程序
可以当网络延时严重时,利用上一次网络好的时间算出新时间。 比如客户端维护一个时间,每秒自己-1s,不停地与传过来的时间比较,取较小值。 没写过工程,口胡的。
不必传递时间差……改成传递 UTC 时刻就可以
问题是我也不确定客户端那边的时钟准不准嘛(还真不一定准),所以传 UTC 时间还是有可能导致倒计时有问题
所以可以在客户端维护一个时间,每次用户连接UOJ,就更新一次,取较小值。
@vfleaking 那只能默认时间差不变,然后测量/消除网络延时了
CDN大法行不行?
我觉得可以用timeanddate.com的时间api,但是那个似乎是外国网站
客户端向服务器发送一个特殊的请求的同时记录发出请求的时间戳 A
服务器收到请求后立刻返回服务器端时间戳 B
客户端接收到服务器的响应时记录时间戳 C
B - A 即为客户端到服务器的延迟,
C - B 即为服务器到客户端的延迟。
可以试试?
网页获得当前时间戳 A 后向服务器发起请求,服务器返回“需要倒计时多长时间”。 网页收到后直接在倒计时时间里减去(当前时间戳 - A)后显示倒计时。 减去(当前时间戳 - A)后的倒计时相比精准的倒计时少了(网页发起请求到服务器进行处理)这段时间,这是预期的(因为选手在倒计时结束时提交代码也需要花费这段时间使其送达服务器)。