我们有一个客户端和一个服务器。我想测量它们之间网络的响应时间。当我向服务器发送请求时,它应该立即响应我的请求,它应该像一个 ping 请求,这样服务器就没有处理时间。
我怎样才能在 Java 中做到这一点?
我们有一个客户端和一个服务器。我想测量它们之间网络的响应时间。当我向服务器发送请求时,它应该立即响应我的请求,它应该像一个 ping 请求,这样服务器就没有处理时间。
我怎样才能在 Java 中做到这一点?
我通过从客户端向服务器发送一个带有时间戳的数据包,然后让服务器返回相同的时间戳来做到这一点。当服务器收到时间戳时,它可以与当前时间戳进行比较以测量往返时间。
显然有一种方法可以在 Java 5 及更高版本中生成ICMP ping 。如果要测量网络速度,只需抓取System.nanoTime()
前后对比即可。请注意,如果您的程序运行时没有足够的权限来执行 ICMP ping,那么 Java 将求助于对端口 7 使用 TCP 回显请求,这仍然可以满足您的需要。
为确保服务器尽快响应,您应该
无论哪种方式,侦听部分(服务器)都应该有自己的线程,否则在处理其他数据包时请求的处理可能会过时。
请注意,无论您如何测量连接速度,都不会得到可靠的值。但是,如果你取几个这样的 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来嗅探“生产”运行服务器的响应时间。