मैं नवीनतम टिप्पणी से प्रेरित था, इसलिए मैंने कोड का यह त्वरित टुकड़ा लिखा।
यह एक प्रकार का "HTTP पिंग" है जो मुझे लगता है कि XMLHttpRequest कॉल() के साथ उपयोग करने के लिए काफी उपयोगी हो सकता है, उदाहरण के लिए यह पता लगाने के लिए कि किसी मामले में उपयोग करने के लिए सबसे तेज़ सर्वर कौन सा है या कुछ न किसी आंकड़े इकट्ठा करना है उपयोगकर्ता की इंटरनेट कनेक्शन गति से।
यह छोटा फ़ंक्शन किसी गैर-मौजूदा यूआरएल (जिसे 404 लौटने की उम्मीद है) पर एक HTTP सर्वर से कनेक्ट हो रहा है, फिर उस समय को माप रहा है जब तक सर्वर HTTP अनुरोध का उत्तर नहीं दे रहा है, और औसत कर रहा है संचयी समय और पुनरावृत्तियों की संख्या पर।
अनुरोधित यूआरएल प्रत्येक कॉल पर यादृच्छिक रूप से संशोधित किया गया है क्योंकि मैंने देखा है कि (शायद) कुछ पारदर्शी प्रॉक्सी या कैशिंग तंत्र जहां कुछ मामलों में परिणाम पकाते हैं, अतिरिक्त तेज उत्तर देते हैं (वास्तव में आईसीएमपी से तेज़ कुछ हद तक अजीब)।
वास्तविक HTTP सर्वर फिट करने वाले FQDNs का उपयोग करने से सावधान रहें! परिणाम आईडी "परिणाम" के साथ एक शरीर तत्व को प्रदर्शित करेगा, उदाहरण के लिए:
<div id="result"></div>
समारोह कोड:
function http_ping(fqdn) {
var NB_ITERATIONS = 4; // number of loop iterations
var MAX_ITERATIONS = 5; // beware: the number of simultaneous XMLHttpRequest is limited by the browser!
var TIME_PERIOD = 1000; // 1000 ms between each ping
var i = 0;
var over_flag = 0;
var time_cumul = 0;
var REQUEST_TIMEOUT = 9000;
var TIMEOUT_ERROR = 0;
document.getElementById('result').innerHTML = "HTTP ping for " + fqdn + "</br>";
var ping_loop = setInterval(function() {
// let's change non-existent URL each time to avoid possible side effect with web proxy-cache software on the line
url = "http://" + fqdn + "/a30Fkezt_77" + Math.random().toString(36).substring(7);
if (i < MAX_ITERATIONS) {
var ping = new XMLHttpRequest();
i++;
ping.seq = i;
over_flag++;
ping.date1 = Date.now();
ping.timeout = REQUEST_TIMEOUT; // it could happen that the request takes a very long time
ping.onreadystatechange = function() { // the request has returned something, let's log it (starting after the first one)
if (ping.readyState == 4 && TIMEOUT_ERROR == 0) {
over_flag--;
if (ping.seq > 1) {
delta_time = Date.now() - ping.date1;
time_cumul += delta_time;
document.getElementById('result').innerHTML += "</br>http_seq=" + (ping.seq-1) + " time=" + delta_time + " ms</br>";
}
}
}
ping.ontimeout = function() {
TIMEOUT_ERROR = 1;
}
ping.open("GET", url, true);
ping.send();
}
if ((i > NB_ITERATIONS) && (over_flag < 1)) { // all requests are passed and have returned
clearInterval(ping_loop);
var avg_time = Math.round(time_cumul/(i - 1));
document.getElementById('result').innerHTML += "</br> Average ping latency on " + (i-1) + " iterations: " + avg_time + "ms </br>";
}
if (TIMEOUT_ERROR == 1) { // timeout: data cannot be accurate
clearInterval(ping_loop);
document.getElementById('result').innerHTML += "<br/> THERE WAS A TIMEOUT ERROR <br/>";
return;
}
}, TIME_PERIOD);
}
उदाहरण के लिए, के साथ लांच:
fp = new http_ping("www.linux.com.au");
ध्यान दें कि मैं इस स्क्रिप्ट के परिणाम आंकड़ों और इसी सर्वर पर आईसीएमपी पिंग के बीच एक सरल कोरलेशन नहीं मिला, हालांकि HTTP प्रतिक्रिया समय आईसीएमपी से लगभग घातीय रूप से घातीय प्रतीत होता है स्पॉन्स समय यह HTTP अनुरोध के माध्यम से स्थानांतरित डेटा की मात्रा द्वारा समझाया जा सकता है जो वेब सर्वर स्वाद और कॉन्फ़िगरेशन के आधार पर भिन्न हो सकता है, जाहिर है सर्वर की गति और शायद अन्य कारणों से।
यह बहुत अच्छा कोड नहीं है, लेकिन मैंने सोचा कि यह मदद कर सकता है और संभवतः दूसरों को प्रेरित कर सकता है।
[इस सवाल] से संबंधित (http://stackoverflow.com/questions/4954587/getting-client-to-automatically-send-data-to-server)। –
http://stackoverflow.com/questions/4282151/is-it-possible-to-ping-a-server-from-javascript ऊपर समाधान की जांच करनी चाहिए। बहुत चालाक –