如何使用Java测量网络的响应时间?

时间:2009-04-07 04:17:57

标签: java networking response-time

我们有一个客户端和一个服务器。我想测量它们之间网络的响应时间。当我向服务器发送请求时,它应立即响应我的请求,它应该像ping请求,以便在服务器上没有处理时间。

我怎样才能用Java做到这一点?

4 个答案:

答案 0 :(得分:2)

我通过从客户端向服务器发送带有时间戳的数据包,然后让服务器返回相同的时间戳来完成此操作。当服务器收到时间戳时,它可以与当前时间戳进行比较以测量往返时间。

显然有一种方法可以在Java 5及更高版本中生成ICMP ping。如果您想测量网络速度,只需在之前和之后抓住System.nanoTime()并进行比较。请注意,如果您的程序运行时没有足够的权限来执行ICMP ping,那么Java将使用TCP回送请求到端口7,这仍然适合您的需要。

答案 1 :(得分:1)

为确保服务器尽快响应,您应该

  1. 与另一个端口建立第二个连接 - 如果您想测试到服务器的路由,即电线 - 或
  2. ,这很有用
  3. 所有传入数据包的公共线程,它将决定传入数据包是否为ping请求并立即响应 - 如果您要测试当前连接(将该连接上的其他数据包考虑在内),这将非常有用。 / LI>

    无论哪种方式,监听部分(服务器)都应该拥有自己的线程,或者在处理其他数据包时,请求的处理可能会失效。

    请注意,无论您采取何种措施来衡量连接速度,都无法获得可靠的值。但是,如果你取几个这样的ping的平均值,你应该有一个可接受的值。

答案 2 :(得分:1)

我认为您需要区分服务器(机器)所花费的时间,以及服务器端进程处理此事件的时间。例如,ping将仅测量ICMP响应时间,这是一个低级别的网络协议返回。如果考虑TCP堆栈,然后考虑服务器的后续处理,则该时间段将更长。

从您的问题来看,听起来像ping(ICMP)就是您想要的。在JDK 5及更高版本中,您可以执行以下操作:

String host = "192.168.0.1"
int timeOut = 5000; 
boolean status = InetAddress.getByName(host).isReachable(timeOut)

你需要使用System.nano()或类似的时间来计算时间。

答案 3 :(得分:0)

使用ping应该足够或wget跟踪传输速率。您可以使用justniffer来嗅探“生产”运行服务器的响应时间。