Sobes.tech
Middle

İstifadəçinin yerli vaxtını server vaxtı ilə necə sinxronizasiya etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Android-də serverlə dəqiq vaxt sinxronizasiyası üçün NTP (Şəbəkə Vaxt Protokolu) istifadə etmək tövsiyə olunur. Android bunun üçün daxili mexanizmlərə malikdir, lakin bəzən vaxtı əl ilə sorğulamaq və ya alternativ yanaşmalardan istifadə etmək lazım olur.

Android-in daxili sinxronizasiyası:

Android sistemi avtomatik olaraq NTP vasitəsilə vaxtı şəbəkə xidmətləri ilə sinxronizasiya edir, adətən standart NTP serverlərindən istifadə edir. İstifadəçi parametrlərdə "Şəbəkə vaxtından istifadə et" seçimini edə bilər. Bu üsul adi hallarda ən etibarlıdır.

Əl ilə sinxronizasiya (xüsusi hallarda):

Bəzi tətbiqlərdə və ya şəbəkə bağlantısı olmayan cihazlarda, müəyyən NTP serverindən əl ilə vaxt sorğulamaq lazım ola bilər. Bunun üçün Apache Commons Net və ya digər NTP kitabxanalarından istifadə edə bilərsiniz.

Apache Commons Net istifadə nümunəsi:

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"; // Nümunə NTP serveri

    public long getSynchronizedTime() {
        NTPUDPClient client = new NTPUDPClient();
        // Standart socket vaxtı 0-dir, onu təyin edək
        client.setDefaultTimeout(10000); // 10 saniyə

        try {
            // NTP serverinin ünvanını sorğu et
            InetAddress inetAddress = InetAddress.getByName(NTP_SERVER);
            // Vaxt məlumatını al
            TimeInfo timeInfo = client.getTime(inetAddress);

            // Vaxt məlumatını emal et
            long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime();

            // Lokal və server vaxtı arasındakı fərqi hesabla
            long localTime = System.currentTimeMillis();
            long networkTime = timeInfo.getReturnTime();
            long roundTripDelay = networkTime - timeInfo.getOriginateTimeStamp().getTime();
            long offset = timeInfo.getOffset();

            // Sinxronlaşdırılmış vaxt lokal vaxt + offset
            long synchronizedTime = localTime + offset;

            return synchronizedTime;

        } catch (IOException e) {
            e.printStackTrace();
            // Xəta baş verərsə, -1 qaytarın və ya istisna atın
            return -1;
        } finally {
            client.close();
        }
    }
}

HTTP sorğusu ilə sinxronizasiya (daha az dəqiq):

Serverdən vaxt almaq üçün HTTP sorğusu göndərib cavabın Date başlığını analiz edə bilərsiniz. Bu metod NTP-dən daha az dəqiqdir, çünki şəbəkə gecikməsinə və veb serverin saatına bağlıdır.

Nümunə:

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ümunə URL

    public long getSynchronizedTime() {
        try {
            URL url = new URL(HTTP_URL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("HEAD"); // Yalnız başlıqları sorğu et
            connection.connect();

            // Date başlığını al
            String dateHeader = connection.getHeaderField("Date");
            if (dateHeader != null) {
                // Başlıqdakı tarixi parse et. Bu format fərqli ola bilər.
                Date date = new Date(dateHeader);
                return date.getTime();
            } else {
                return -1; // "Date" başlığı yoxdur
            }

        } catch (IOException e) {
            e.printStackTrace();
            return -1; // Sorğu zamanı xəta
        }
    }
}

Tövsiyələr:

  • Ən çox hallarda Android-in daxili sinxronizasiyasına etibar edin.
  • Əgər daha yüksək dəqiqlik və ya NTP server üzərində nəzarət tələb olunursa, Apache Commons Net və ya oxşar kitabxanalardan istifadə edin.
  • HTTP vasitəsilə sinxronizasiya daha az dəqiqdir və dəqiq vaxt tələb edən kritik əməliyyatlar üçün tövsiyə edilmir.
  • Əl ilə sinxronizasiya zamanı şəbəkə xətalarını və serverin düzgün olmayan cavablarını işləyin.
  • Sinxronizasiyanı fon axınında həyata keçirin ki, UI bloklanmasın.