Sobes.tech
Middle

Kuidas sünkroniseerida kasutaja kohaliku aja serveri ajaga?

sobes.tech AI

Vastus AI-lt

Täpselt aja sünkroniseerimiseks serveriga Androidis on soovitatav kasutada NTP (Network Time Protocol). Androidil on selleks sisseehitatud mehhanismid, kuid mõnikord on vaja aega käsitsi pärida või kasutada alternatiivseid lähenemisviise.

Androidi sisseehitatud sünkroniseerimine:

Android süsteem sünkroniseerib automaatselt aega NTP kaudu, tavaliselt kasutades standardseid NTP-servereid. Kasutaja saab seadetes valida valiku "Kasuta võrgu aega". See meetod on kõige usaldusväärsem tavapärastes olukordades.

Käsitsi sünkroniseerimine (erijuhtudel):

Mõnedes rakendustes või seadmetes, millel puudub internetiühendus, võib olla vajalik käsitsi küsida aega konkreetse NTP-serveri kaudu. Selleks saab kasutada Apache Commons Net või teisi teeke:

Näide Apache Commons Net kasutamisest:

import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;
import java.io.IOException;
import java.net.InetAddress;

public class TimeSynchronizer {

    private static final String NTP_SERVER = "pool.ntp.org"; // NTP serveri näide

    public long getSynchronizedTime() {
        NTPUDPClient client = new NTPUDPClient();
        client.setDefaultTimeout(10000); // 10 sekundit

        try {
            InetAddress inetAddress = InetAddress.getByName(NTP_SERVER);
            TimeInfo timeInfo = client.getTime(inetAddress);
            long transmitTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();
            long localTime = System.currentTimeMillis();
            long offset = timeInfo.getOffset();
            long synchronizedTime = localTime + offset;
            return synchronizedTime;
        } catch (IOException e) {
            e.printStackTrace();
            return -1;
        } finally {
            client.close();
        }
    }
}

HTTP-põhise sünkroniseerimise näide (vähem täpne):

Serveri ajale võib ligi pääseda, saates HTTP-päringu ja analüüsides vastuse päist Date. See meetod on vähem täpne, kuna sõltub võrgu viivitusest ja veebiserveri kellast:

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;

public class HttpTimeSynchronizer {

    private static final String HTTP_URL = "https://www.google.com"; // Näide URL

    public long getSynchronizedTime() {
        try {
            URL url = new URL(HTTP_URL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("HEAD");
            connection.connect();
            String dateHeader = connection.getHeaderField("Date");
            if (dateHeader != null) {
                Date date = new Date(dateHeader);
                return date.getTime();
            } else {
                return -1;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return -1;
        }
    }
}

Soovitused:

  • Kasutage Androidi sisseehitatud sünkroniseerimist.
  • Kui on vaja suuremat täpsust või kontrolli NTP serveri üle, kasutage Apache Commons Net või sarnaseid teeke.
  • HTTP sünkroniseerimine on vähem täpne ja seda ei soovitata kriitiliste operatsioonide jaoks, mis nõuavad täpset aega.
  • Käsitsi sünkroniseerimisel arvestage võrguga seotud vigu ja serveri vastuseid.
  • Tehke sünkroniseerimine taustal, et vältida UI blokeerimist.