计算运行Java程序的两台计算机之间的消息延迟

时间:2014-03-21 22:22:38

标签: java delay

我在两台计算机上运行两个程序(比如A和B),A和B都连接到专用LAN,可以轻松地ping /发送/接收数据。

我在计算机A的程序中有一个方法,我在其中定期发送一个简单的字符串给接收它的B。

我使用在字符串本身设置发送时间 long sent = System.currentTimeMillis()

在计算机B中,我有一个线程正在运行以接收字符串并处理它,在收到字符串后,我使用相同的long receive = System.currentTimeMillis()得到当前时间,然后使用

计算最终延迟

long delay = receive - sent; long finalDelay = TimeUnit.MILLISECONDS.convert(delay, TimeUnit.MILLISECONDS);

问题在于,在接收方,我得到了奇怪的值,延迟为负数(大数和小数)。

我尝试在没有long delay = receive - sent;机制的情况下使用TimeUnit但仍然获得负值。

我已将A和B同步到时间服务器。两者都运行Windows 7操作系统,Java 1.7_21 jdk和Netbeans IDE 7.4

我尝试使用System.nanoTime(),但它提供了相同的结果,我认为System.nanoTime()无法在我的方案中使用send,而receive会有不同的开始时间,因为它们都运行在不同的JVM和不同的机器上。

那么我犯的错误是什么?任何帮助将受到高度赞赏。

更新:使用发件人和收件人端代码

发件人

 while (true) {
        try {

            rCon = (RadiogramConnection) Connector.open("radiogram://broadcast:" + HOST_PORT);
            dg = rCon.newDatagram(50);  // only sending 12 bytes of data 
            // Get the current time and sensor reading

            double tempReading = tempSensor.getCelsius();
            long now = VM.getTimeMillis(); // I used System.currentTimeMillis() as well as new Date().gettime() here


            // Flash an LED to indicate a sampling event
            led.setRGB(255, 0, 0);
            led.setOn();
            Utils.sleep(50);
            led.setOff();

            // Package the time and sensor reading into a radio datagram and send it.
            dg.reset();
            dg.writeLong(now);   // I send the time in a datagram
            dg.writeInt((int)tempReading);              
            rCon.send(dg);

            rCon.close();         

            // Go to sleep to conserve battery
            Utils.sleep(SAMPLE_PERIOD - (System.currentTimeMillis() - now));
        } catch (Exception e) {
            System.err.println("Caught " + e + " while collecting/sending sensor sample.");
        }
    }

接收机

public void run()  throws Exception {
    RadiogramConnection rCon;
    Datagram dg;

    try {

        rCon = (RadiogramConnection) Connector.open("radiogram://:" + HOST_PORT);
        dg = rCon.newDatagram(rCon.getMaximumLength());
    } catch (IOException e) {
         System.err.println("setUp caught " + e.getMessage());
         throw e;
    }
    // Main data collection loop
    while (true) {
        try {
            // Read sensor sample received over the radio
            rCon.receive(dg);


            long sendTime = dg.readLong();      // read time of the reading
            int val = dg.readInt();

            long time = System.currentTimeMillis();                

             System.out.println("Original Time : "+sendTime +" ms and Receiving Time : "+time+
                     " ms =:= Temperature value = " + val); 
             System.out.println("The Total delay is: "+(time-sendTime));

如果我在同一台计算机上运行发送方和接收方,那么我会得到预期的延迟值,但在不同的计算机上却很疯狂。

1 个答案:

答案 0 :(得分:2)

在请求主机上测量完整的往返,请求和响应的时间,并将其除以2。这样你就可以随时偏离等式。