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

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

我怎么能用Java做到这一点?

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

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

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

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

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

请注意,无论您如何测量连接速度,都不会有可靠的值。 但是,如果你取几个这样的ping的平均值,你应该有一个可接受的值。

我认为您需要区分服务器(机器)所花费的时间,以及服务器端进程处理此事件的时间。 例如,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()或类似的时间。

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