Java 如何轮询每1秒更新一次的服务器?

Java 如何轮询每1秒更新一次的服务器?,java,real-time,Java,Real Time,我有一个服务器,它返回一个JSON对象,其中包含关于过去一秒钟发生的事情的信息,例如 { time: 2011-06-08 05:07:33, total: 235324, average: 1233 } 轮询此服务器以便获取每次更新的最佳方式是什么?我猜我不想只轮询服务器,休眠1秒,然后再次轮询(因为轮询可能需要一些时间,导致事情延迟,所以我可能会错过一些更新)。我是否应该改为只睡眠0.5秒,轮询服务器,然后检查我收到的JSON对象是否与我上次收到的JSON具有不同的

我有一个服务器,它返回一个JSON对象,其中包含关于过去一秒钟发生的事情的信息,例如

{
    time: 2011-06-08 05:07:33,
    total: 235324,
    average: 1233
}
轮询此服务器以便获取每次更新的最佳方式是什么?我猜我不想只轮询服务器,休眠1秒,然后再次轮询(因为轮询可能需要一些时间,导致事情延迟,所以我可能会错过一些更新)。我是否应该改为只睡眠0.5秒,轮询服务器,然后检查我收到的JSON对象是否与我上次收到的JSON具有不同的时间戳


(顺便说一句,我是用Java来做这件事的,尽管我认为语言并不重要。)

如果你需要获得每一个更新,服务器应该将更新推送到你那里,而不是向另一个方向


例如,您应该考虑在客户端和服务器之间设置一个流,以便服务器可以向客户端发送事件通知。

如果您需要获取每个更新,服务器应该将更新推送到您的手中,而不是向其他方向推送

例如,您应该考虑在客户端和服务器之间设置一个流,以便服务器可以向客户端发送事件通知。

您可以使用“阻塞拉”模式(不知道它的真实名称):

  • 客户端轮询和服务器询问信息
  • 服务器等待,直到它有了新的信息(如果信息准备好了,可能根本没有时间)
  • 服务器响应信息
  • 转到第1步
  • 这种模式的优点是

  • 通信量保持在最低限度
  • 新信息可用与发送给您之间没有延迟(使用轮询时,平均延迟为轮询频率的50%)
  • 缺点是客户端几乎总是处于阻塞状态。这可能不适合所有客户端应用程序

    您可以使用“阻塞-拉动”模式(不知道它的真实名称):

  • 客户端轮询和服务器询问信息
  • 服务器等待,直到它有了新的信息(如果信息准备好了,可能根本没有时间)
  • 服务器响应信息
  • 转到第1步
  • 这种模式的优点是

  • 通信量保持在最低限度
  • 新信息可用与发送给您之间没有延迟(使用轮询时,平均延迟为轮询频率的50%)

  • 缺点是客户端几乎总是处于阻塞状态。这可能不适合所有客户端应用程序

    很难做到这一点。客户端计算机可能具有较高的资源使用率,因此在任何特定时间都没有时间进行调用。也许您应该研究其他的方法来实现这一点,比如将所有数据排队,并在客户机请求时发送数据。因此,如果客户很忙,并且最终等待了2或3秒,那么他们不会错过任何东西。要做到这一点非常困难。客户端计算机可能具有较高的资源使用率,因此在任何特定时间都没有时间进行调用。也许您应该研究其他的方法来实现这一点,比如将所有数据排队,并在客户机请求时发送数据。因此,如果客户机很忙,并最终等待2或3秒,他们不会错过任何东西。这不是一种非常迂回的推送方法吗?只需在应用程序中注册自己并让它向您推送更新,听起来就容易多了。这样,您就可以创建一些被调用的处理程序,而不必阻塞。这不是一个非常迂回的推送方法吗?只需在应用程序中注册自己并让它向您推送更新,听起来就容易多了。这样,您就可以创建一些被调用的处理程序,而不必阻塞。