Почему NTP не может вычислить время задержки

Я использую NTP из общей сетевой библиотеки для синхронизации времени для своего приложения для Android. Я пытаюсь получить задержку, используя этот код:

public static final String TIME_SERVER = "time-a.nist.gov";

public static long getCurrentNetworkTime() throws IOException {
    NTPUDPClient timeClient = new NTPUDPClient();
    InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
    TimeInfo timeInfo = timeClient.getTime(inetAddress);
    long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); // server time

    Log.d("TAG", "delay: " + timeInfo.getDelay() + " time:" + returnTime
            + " local time:" + System.currentTimeMillis());

    return returnTime;
}

Но я получаю null за timeInfo.getDelay(). Судя по документации этого метода, он может быть недоступен:

    /**
     * Get round-trip network delay. If null then could not compute the delay.
     *
     * @return Long or null if delay not available.
     */
    public Long getDelay()
    {
        return _delay;
    }

Почему он не мог вычислить задержку?


person AliSh    schedule 24.01.2016    source источник


Ответы (1)


Моя проблема решена путем переопределения NTPUDPClient, копирования кода этого класса и изменения параметра для получения подробной информации в TimeInfo:

TimeInfo info = new TimeInfo(recMessage, returnTime, true);

Это класс MyNTPUDPClient, используйте его вместо NTPUDPClient:

public final class MyNTPUDPClient extends DatagramSocketClient {
    public static final int DEFAULT_PORT = 123;

private int _version = NtpV3Packet.VERSION_3;

public TimeInfo getTime(InetAddress host, int port) throws IOException {
    // if not connected then open to next available UDP port
    if (!isOpen()) {
        open();
    }

    NtpV3Packet message = new NtpV3Impl();
    message.setMode(NtpV3Packet.MODE_CLIENT);
    message.setVersion(_version);
    DatagramPacket sendPacket = message.getDatagramPacket();
    sendPacket.setAddress(host);
    sendPacket.setPort(port);

    NtpV3Packet recMessage = new NtpV3Impl();
    DatagramPacket receivePacket = recMessage.getDatagramPacket();

    TimeStamp now = TimeStamp.getCurrentTime();

    message.setTransmitTime(now);

    _socket_.send(sendPacket);
    _socket_.receive(receivePacket);

    long returnTime = System.currentTimeMillis();
    TimeInfo info = new TimeInfo(recMessage, returnTime, true);

    return info;
}

public TimeInfo getTime(InetAddress host) throws IOException {
    return getTime(host, NtpV3Packet.NTP_PORT);
}

public int getVersion() {
    return _version;
}

public void setVersion(int version) {
    _version = version;
}

}
person AliSh    schedule 24.01.2016