2009-05-29 35 views
19

Tôi cần phần mềm của mình để liên lạc với máy chủ NTP để xác định bù đồng hồ cục bộ. Tôi đã thử sử dụng gói org.apache.commons.net.ntp, nhưng việc triển khai nó khá kém khi chạy trên Windows, vì việc sử dụng System.currentTimeMillis() để xác định thời gian trước và sau khi trao đổi gói NTP. Như bạn có thể hoặc có thể không biết, giá trị này chỉ được cập nhật khi các đồng hồ hệ thống đánh dấu, mà trên hầu hết các máy chủ Win2k3 hiện đại là 64Hz hoặc mỗi 15.625ms. Điều này giúp hạn chế độ chính xác của tính toán bù đồng hồ.Máy khách Java NTP

Ntpd sử dụng bộ hẹn giờ tần số cao CPU để nội suy giữa các dấu tích hệ thống đồng hồ và đạt được độ phân giải cao hơn nhiều. Bạn có biết về việc triển khai Java sử dụng kỹ thuật này hay một kỹ thuật tương tự không? Hoặc bạn có biết về bất kỳ triển khai NTP nào khác ngoài Apache không?

+0

Bạn có thể không nộp một bản vá vào thư viện Apache Commons? –

+2

Cho thời gian để thực hiện và kiểm tra nó, và sự sẵn sàng của các công ty của tôi, tôi có thể. –

+0

Tôi đã hỏi [một câu hỏi tương tự] (https://softwarerecs.stackexchange.com/q/48920/1255) về * Khuyến nghị phần mềm Stack Exchange *. –

Trả lời

3

Nếu bạn đang sử dụng Java 5 trở lên, bạn có thể sử dụng System.nanoTime() để thực hiện phép đo thời gian bù trừ chính xác hơn không? Bạn sẽ phải sửa đổi mã NTP hiện tại của mình, nhưng bạn nên có nguồn cho nó, và tôi sẽ không mong đợi điều này là khó khăn.

+0

Có, System.nanoTime() truy cập bộ định thời tần số cao, và tôi hy vọng điều này sẽ được sử dụng để định thời gian trong một thực thi Java NTP phong nha. Tuy nhiên, điều này là không tầm thường vì vậy tôi hy vọng một người khác đã thực hiện và gỡ lỗi nó. –

+0

Có. Tôi không thể tìm thấy bất kỳ triển khai rõ ràng mặc dù. Một cơ hội cho sự nổi tiếng và tôn trọng, có thể? :-) –

+1

System.nanoTime() chỉ có thể được sử dụng để đo thời gian trôi qua và không liên quan đến bất kỳ khái niệm nào khác của hệ thống hoặc đồng hồ treo tường nên không thể sử dụng để so sánh thời gian hệ thống cục bộ với thời gian tuyệt đối từ máy chủ NTP. – JasonM1

10

có một thực hiện CTMTQG Java trên support.ntp.org

+0

Than ôi, nó là một thực hiện ngây thơ của SNTP. Nhưng 1 cho việc tìm kiếm nó, cảm ơn. –

9

Kể từ khi câu hỏi này có vị trí rất cao trên Google cho "Java NTP client":

Android có một tốt đẹp, nhỏ gọn thực hiện Apache được cấp phép của một NTP client đơn giản : android.net.SntpClient.

Nó sẽ cần phải được sửa đổi để chạy trên java không phải Android, nhưng điều này là tầm thường, vì mã là khoảng 100 dòng mã cộng với 100 dòng chú thích chi tiết khác, không phụ thuộc bên ngoài ngoại trừ đồng hồ hệ thống Android - và tình cờ, nó đã sẵn sàng để chấp nhận các bộ tính giờ tương đối như nanoTime() vì nó đã sử dụng bộ hẹn giờ tương đối như vậy.

+0

Làm thế nào để bạn thay thế 'SystemClock.elapsedRealtime();'? – Bhargav

Các vấn đề liên quan