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

如何使用Java测量网络的响应时间?,java,networking,response-time,Java,Networking,Response Time,我们有一个客户端和一个服务器。我想测量它们之间网络的响应时间。当我向服务器发送请求时,它应该立即响应我的请求,它应该像ping请求一样,以便在服务器上没有处理时间 如何在Java中做到这一点?我通过将带有时间戳的数据包从客户端发送到服务器,然后让服务器返回相同的时间戳来做到这一点。当服务器收到时间戳时,它可以与当前时间戳进行比较,以测量往返时间 显然有一种方法可以在Java5和更高版本中生成。如果您想测量网络速度,只需抓取System.nanoTime()前后并进行比较。请注意,如果您的程序运行

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


如何在Java中做到这一点?

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


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

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

  • 与另一个端口建立第二个连接-如果要测试到服务器的路由(即导线),这非常有用-或
  • 一个用于所有传入数据包的公共线程,它将决定传入数据包是否为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应该足够了,或者跟踪传输速率足够了。您可以使用嗅探“生产”运行服务器的响应时间。

    但我无权访问服务器,只能更改客户端应用程序。如果您无权访问服务器,服务器中是否有任何东西可以用来向客户端返回它可以跟踪的内容?我无法访问服务器,而且每次服务器地址都会不同。因此,我们只有可以交互和修改的客户端。我认为java只支持UDP和TCP。但在ping请求中使用ICMP,那么我们如何在java中实现它呢?谢谢你的帮助。但是我们如何使用这个方法测量响应时间,因为它只返回布尔值。kinaly帮助。在调用它之前获取纳秒数。那就叫它吧。然后得到纳秒数。从另一个减去一个,你就得到了时间段。是的,我也做了同样的,但它与ping请求不匹配。在ping请求中,我得到了5毫秒,而对于代码相同的IP地址,我得到了1024毫秒。我认为它不可靠。如果你能帮忙的话,我会很高兴的。对我的系统进行快速测试看起来不错。2个问题。1) 1000000ns=1ms,是吗?2) 由于Java在运行时的类加载和优化,您可能希望在循环中执行此“n”次,并取平均值是,1000000ns=1ms。您可以尝试另一个ip地址,而不是您的系统ip。如果您有解决方案,请让我知道。