2009-05-29 8 views
19

मुझे स्थानीय घड़ी ऑफसेट निर्धारित करने के लिए एनटीपी सर्वर के साथ संवाद करने के लिए अपने सॉफ़्टवेयर की आवश्यकता है। मैंने org.apache.commons.net.ntp पैकेज का उपयोग करने का प्रयास किया है, लेकिन एनटीपी पैकेट एक्सचेंज से पहले और बाद में समय निर्धारित करने के लिए System.currentTimeMillis() के उपयोग के कारण विंडोज़ पर चलते समय इसका कार्यान्वयन खराब है। जैसा कि आप जानते हैं या नहीं जानते हैं, यह मान केवल तभी अपडेट किया जाता है जब सिस्टम घड़ी टिकती है, जो कि अधिकांश आधुनिक Win2k3 सर्वर 64Hz या प्रत्येक 15.625ms पर है। यह घड़ी ऑफ़सेट गणना की सटीकता को बहुत सीमित करता है।जावा एनटीपी क्लाइंट

एनटीपीडी सीपीयू उच्च-आवृत्ति टाइमर का उपयोग सिस्टम घड़ी टिकों के बीच इंटरपोलेट करने के लिए करता है, और अधिक रिज़ॉल्यूशन समय प्राप्त करता है। क्या आप जावा कार्यान्वयन के बारे में जानते हैं जो इस या एक समान तकनीक का उपयोग करता है? या आप अपाचे के अलावा किसी भी अन्य एनटीपी कार्यान्वयन के बारे में जानते हैं?

+0

आप अपाचे कॉमन्स पुस्तकालय के लिए एक पैच प्रस्तुत नहीं कर सकते? –

+2

इसे लागू करने और परीक्षण करने के लिए समय दिया गया है, और मेरे कॉर्पोरेट अधिकारियों की इच्छा, हाँ मैं कर सकता था। –

+0

मैंने पूछा [एक समान प्रश्न] (https://softwarerecs.stackexchange.com/q/48920/1255) * सॉफ्टवेयर सिफारिशों स्टैक एक्सचेंज * पर। –

उत्तर

3

यदि आप जावा 5 या ऊपर का उपयोग कर रहे हैं, तो क्या आप System.nanoTime() का उपयोग समय ऑफसेट के अधिक सटीक माप करने के लिए कर सकते हैं? आपको अपने मौजूदा एनटीपी कोड को संशोधित करना होगा, लेकिन आपके पास इसका स्रोत होना चाहिए, और मैं यह अपेक्षा नहीं करना चाहूंगा कि यह मुश्किल हो।

+0

हां, System.nanoTime() उच्च-आवृत्ति टाइमर तक पहुंचता है, और मैं उम्मीद करता हूं कि यह एक सभ्य जावा एनटीपी कार्यान्वयन में टाइमस्टैम्पिंग के लिए उपयोग किया जाएगा। हालांकि, यह गैर-तुच्छ है इसलिए मुझे उम्मीद है कि किसी और ने पहले से ही इसे पूरा कर लिया है और इसे डीबग किया है। –

+0

हां। हालांकि मुझे कोई स्पष्ट कार्यान्वयन नहीं मिला। प्रसिद्धि और सम्मान के लिए एक मौका, शायद? :-) –

+1

System.nanoTime() का उपयोग केवल समाप्त समय को मापने के लिए किया जा सकता है और सिस्टम या दीवार घड़ी के किसी भी अन्य विचार से संबंधित नहीं है, इसलिए स्थानीय सिस्टम समय को एनटीपी सर्वर से पूर्ण समय की तुलना करने के लिए उपयोग नहीं किया जा सकता है। – JasonM1

10
+0

हां, यह एसएनटीपी का एक निष्क्रिय कार्यान्वयन है। लेकिन इसे खोजने के लिए +1, धन्यवाद। –

9

पर एक एनटीपी जावा कार्यान्वयन है के बाद से यह सवाल "जावा एनटीपी ग्राहक" के लिए गूगल पर बहुत ही उच्च स्थान पर है:

एंड्रॉयड एक सरल एनटीपी ग्राहक का एक अच्छा, कॉम्पैक्ट अपाचे लाइसेंस प्राप्त कार्यान्वयन है : android.net.SntpClient

इसे गैर-एंड्रॉइड जावा पर चलाने के लिए संशोधित करने की आवश्यकता होगी, लेकिन यह छोटा होना चाहिए, क्योंकि कोड कोड की लगभग 100 पंक्तियां और विस्तृत टिप्पणियों की एक और 100 पंक्तियां हैं, एंड्रॉइड सिस्टम घड़ी को छोड़कर कोई बाहरी निर्भरता नहीं है - और मौके से, यह nanoTime() जैसे सापेक्ष टाइमर स्वीकार करने के लिए तैयार है क्योंकि यह पहले से ही इस तरह के एक रिश्तेदार टाइमर का उपयोग करता है।

+0

आप 'SystemClock.elapsedRealtime();' को कैसे बदलते हैं? – Bhargav

2

मैं एक जावा कार्यान्वयन (जावा 7) है कि आप उपयोग कर सकते हैं लिखा है: SntpClient

संबंधित मुद्दे