4

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

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

4

4 回答 4

2

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

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

于 2009-04-07T04:20:36.500 回答
1

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

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

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

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

于 2009-04-07T04:29:29.350 回答
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()或类似的时间。

于 2009-04-07T10:10:37.767 回答
0

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

于 2011-11-02T14:58:49.350 回答