我正在尝试创建一个类似于BidCactus和LanceLivre的网站。
我遇到问题的具体部分是计时器的秒数。
当拍卖开始时,15秒的计时器开始倒计时,每次人们出价时,计时器都会重置,并且物品的价格会增加0,01美元。
我已经尝试过将SignalR用于此位,虽然它在办公室试运行期间确实运行良好,但对于秒计数的实际使用情况来说还不够好。当有太多用户在网站上出价和闲置时,我会收到HTTP 503错误。
如何让客户端的计时器显示正确的剩余时间?
HTTP每秒使用AJAX获取该信息是否允许我正确显示丢失的时间?这是每秒一个请求!
不仅如此,但是当用户请求GET时,我会计算剩余秒数,但在用户看到该响应之前,该时间不再有用,因为在处理和返回之间可能会传递一秒或更长时间。你看到我的难题吗?
有关如何解决此问题的任何建议吗?
答案 0 :(得分:0)
实现真正良好的实时通信的一种方法是打开从浏览器到您在服务器上编写的特殊tcp / ip套接字服务器的连接。这就是网上很多聊天包的工作方式。
双工插座允许您向两个方向推送数据。由于连接已经打开,因此您可以发送相当多的非常快速的数据。
过去,您需要使用Adobe Flash来完成此任务。我不确定浏览器是否已经足够先进,无需插件即可处理(例如,websockets?)
另一个值得关注的方法是长期投票。从概念上讲,它与服务器建立了连接,它不会消亡,它使您有机会在服务器上向客户端发送一些实时数据。
只是一些指示。我使用JavaScript <-> Flash <-> Python/PHP
编写了网络软件,并对它的工作方式表示满意。
答案 1 :(得分:0)
您所描述的解决方案存在一些问题:
处理#2和#3需要复杂的算法。
如果实际上需要二级准确度
现有的互联网标准软件可以解决它 - Network Time Protocol。
使用真正的NTP客户端(不是Windows内置的客户端 - it only guarantees it will be accurate to within a couple seconds)将服务器与国家标准NTP服务器同步,并在您的应用程序中构建真正的NTP客户端。定期在服务器上同步时间,并定期在客户端同步时间(可能每次登录/连接?可能每小时?)。然后只需使用系统时钟进行时间计算。
不要尝试同步客户端的系统时间 - 他们可能无权访问,而且肯定不是来自浏览器。相反,您可以获得相对于系统时间的参考时间,并简单地将差异作为客户端计算的偏移量添加。
如果您实际上不需要二级准确度
您可能不需要在一秒钟内保证准确性。
如果你做出这个决定,你可以简化一些事情。只需将相对完成时间传送给客户进行每次拍卖,而不是绝对时间。每隔一段时间(例如每分钟)在客户端重新请求它。他们的全球系统时间可能不同步,但他们的时钟上的二手应该非常准确地记下秒。
如果你想让它更光滑,你可以尝试确定每次调用服务器的(相对)延迟。跟踪调用服务器之间经过的时间以及上一次调用的时间剩余值。比较他们。然后,计算较小者,并将新时间基于该计算。
但是,在设计这样的解决方案时我会小心。如果您的计算错误,或者处理的系统时钟不准确,您可能会破坏整个同步模型,或者无意中导致客户端更喜欢 higest 延迟调用。如果您编写此代码的“光滑”版本,请确保考虑所有情况:)