İ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.