अच्छी पुरानी ICMP Timestamp संदेश योजना का रिज़ॉर्ट। यह जावास्क्रिप्ट और PHP में लागू करने के लिए काफी छोटा है।
// browser.js
var request = new XMLHttpRequest();
request.onreadystatechange = readystatechangehandler;
request.open("POST", "http://www.example.com/sync.php", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send("original=" + (new Date).getTime());
function readystatechangehandler() {
var returned = (new Date).getTime();
if (request.readyState === 4 && request.status === 200) {
var timestamp = request.responseText.split('|');
var original = + timestamp[0];
var receive = + timestamp[1];
var transmit = + timestamp[2];
var sending = receive - original;
var receiving = returned - transmit;
var roundtrip = sending + receiving;
var oneway = roundtrip/2;
var difference = sending - oneway; // this is what you want
// so the server time will be client time + difference
}
}
अब
sync.php
कोड के लिए
:
यहाँ इस योजना जावास्क्रिप्ट और PHP का उपयोग का एक कार्यान्वयन है
<?php
$receive = round(microtime(true) * 1000);
echo $_POST["original"] . '|';
echo $receive . '|';
echo round(microtime(true) * 1000);
?>
मैं ऊपर कोड का परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए।
नोट: निम्न विधि क्लाइंट और सर्वर के बीच के समय के अंतर की सटीक गणना करेगा, बशर्ते संदेश भेजने और प्राप्त करने का वास्तविक समय समान या लगभग समान हो। इस परिदृश्य पर विचार करें:
Time Client Server
-------- -------- --------
Original 0 2
Receive 3 5
Transmit 4 6
Returned 7 9
- आप देख सकते हैं, क्लाइंट और सर्वर घड़ियों सिंक बंद 2 इकाइयां हैं। इसलिए जब ग्राहक टाइमस्टैंप अनुरोध भेजता है, तो यह मूल समय को 0
- सर्वर को अनुरोध 3 इकाइयों को प्राप्त करता है, लेकिन प्राप्त समय को 5 इकाइयों के रूप में रिकॉर्ड करता है क्योंकि यह 2 इकाइयां आगे है।
- फिर यह टाइमस्टैम्प उत्तर को एक इकाई बाद में प्रसारित करता है और प्रेषण समय को 6 इकाइयों के रूप में रिकॉर्ड करता है।
- ग्राहक को 3 इकाइयों के बाद जवाब प्राप्त होता है (यानी सर्वर के अनुसार 9 इकाइयों पर)। हालांकि, चूंकि यह सर्वर के पीछे 2 इकाइयां है, इसलिए यह लौटा हुआ समय 7 इकाइयों के रूप में रिकॉर्ड करता है।
इस डेटा का उपयोग करना, हम गणना कर सकते हैं:
Sending = Receive - Original = 5 - 0 = 5
Receiving = Returned - Transmit = 7 - 6 = 1
Roundtrip = Sending + Receiving = 5 + 1 = 6
आप ऊपर से देख सकते हैं, भेजने और प्राप्त करने के समय को गलत तरीके से पर कितना क्लाइंट और सर्वर सिंक बंद कर रहे हैं निर्भर करता है गणना कर रहे हैं। हालांकि, राउंडट्रिप समय हमेशा सही होगा क्योंकि हम पहले दो इकाइयां जोड़ रहे हैं (मूल प्राप्त करें), और फिर दो इकाइयों को घटाकर (लौटाया गया - प्रेषण)।
अगर हम मान लेते हैं कि oneway समय हमेशा गोल यात्रा आधे समय के लिए है (यानी समय संचारित करने के लिए समय प्राप्त करने के लिए है, तो हम आसानी से समय अंतर के रूप में इस गणना कर सकते हैं):
Oneway = Roundtrip/2 = 6/2 = 3
Difference = Sending - Oneway = 5 - 3 = 2
के रूप में आप देख सकते हैं, हमने सटीक रूप से 2 इकाइयों के रूप में समय अंतर की गणना की। समय अंतर के लिए समीकरण हमेशा sending - oneway
समय होता है। हालांकि, इस समीकरण की सटीकता इस बात पर निर्भर करती है कि आप कितनी सटीक समय पर गणना करते हैं। यदि संदेश भेजने और प्राप्त करने का वास्तविक समय बराबर या लगभग बराबर नहीं है, तो आपको एक ही समय की गणना करने के लिए कुछ और तरीका ढूंढना होगा।हालांकि, आपके उद्देश्यों के लिए यह पर्याप्त होना चाहिए।
मैं जावास्क्रिप्ट से आईसीएमपी पैकेट कैसे भेज सकता हूं? मैंने आईसीएमपी पैकेट भेजने के लिए केवल ActiveXocket नामक एक ActiveX देखा है, लेकिन मैं ActiveX का उपयोग नहीं कर सकता। यह वेबकिट पर जोरदार काम करता है। – micred
आप आईसीएमपी पैकेट नहीं भेजते हैं। आप बस उसी विधि का उपयोग करते हैं जो आईसीएमपी सर्वर और क्लाइंट पर समय सिंक्रनाइज़ करने के लिए उपयोग करता है। उम्मीद है कि आपके संदेह को साफ़ करता है। चीयर्स। ;) –
PHP में आपका स्वरूपण गलत दिखता है: 'पैरामीटर के साथ' microtime() 'फॉर्म "0.uuuuuu ssssssssss" की स्ट्रिंग देता है। मैं बल्कि गूंज (microtime (सच) * 1000) 'गूंजना होगा। –