Sobes.tech
Middle

Kaip sinchronizuoti naudotojo vietinį laiką su serverio laiku?

sobes.tech AI

Atsakymas iš AI

Tiksliai sinchronizuoti laiką su serveriu Android platformoje, rekomenduojama naudoti NTP (Network Time Protocol). Android turi įmontuotus mechanizmus, tačiau kartais reikia rankiniu būdu užklausti laiką arba naudoti alternatyvius metodus.

Android įmontuota sinchronizacija:

Android sistema automatiškai sinchronizuoja laiką per NTP, dažniausiai naudojant standartinius NTP serverius. Vartotojas gali pasirinkti "Naudoti tinklo laiką" parinktį nustatymuose. Šis metodas yra patikimiausias įprastiems scenarijams.

Rankinė sinchronizacija (ypatingais atvejais):

Kai kuriose programose arba įrenginiuose be interneto ryšio gali prireikti rankiniu būdu užklausti laiką iš konkretaus NTP serverio. Tam galima naudoti Apache Commons Net arba kitas bibliotekas:

Pavyzdys naudojant Apache Commons Net:

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 serverio pavyzdys

    public long getSynchronizedTime() {
        NTPUDPClient client = new NTPUDPClient();
        client.setDefaultTimeout(10000); // 10 sekundžių

        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 užklausos būdu sinchronizacija (mažiau tiksliai):

Galima gauti laiką iš serverio siunčiant HTTP užklausą ir analizuojant Date antraštę atsakyme. Šis metodas yra mažiau tikslus, nes priklauso nuo tinklo delsimo ir laikrodžių tikslumo web serveryje:

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"; // Pavyzdinis 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;
        }
    }
}

Rekomendacijos:

  • Naudokite Android įmontuotą sinchronizaciją.
  • Jei reikalingas didesnis tikslumas arba kontrolė NTP serveriu, naudokite Apache Commons Net arba panašias bibliotekas.
  • HTTP sinchronizacija yra mažiau tiksliai ir nerekomenduojama kritinėms operacijoms, priklausančioms nuo tikslaus laiko.
  • Rankiniu būdu sinchronizuojant, tvarkykite galimas tinklo klaidas ir neteisingus serverio atsakymus.
  • Atlikite sinchronizaciją fone, kad neužblokuotumėte vartotojo sąsajos.