मैं एक जावास्क्रिप्ट पृष्ठ कैसे बना सकता हूं जो उपयोगकर्ता की इंटरनेट गति का पता लगाएगा और उसे पृष्ठ पर दिखाएगा? कुछ इस तरह से “आपकी इंटरनेट स्पीड है ?? / ?? Kb / s ” ।
मैं एक जावास्क्रिप्ट पृष्ठ कैसे बना सकता हूं जो उपयोगकर्ता की इंटरनेट गति का पता लगाएगा और उसे पृष्ठ पर दिखाएगा? कुछ इस तरह से “आपकी इंटरनेट स्पीड है ?? / ?? Kb / s ” ।
जवाबों:
यह कुछ हद तक संभव है, लेकिन वास्तव में सटीक नहीं होगा, विचार एक ज्ञात फ़ाइल आकार के साथ लोड छवि है, फिर इसके onload
घटना माप में उस घटना को ट्रिगर होने तक कितना समय बीत गया, और इस बार छवि फ़ाइल आकार में विभाजित करें।
उदाहरण यहां पाया जा सकता है: जावास्क्रिप्ट का उपयोग करके गति की गणना करें
निर्धारित सुझाव को लागू करने वाला टेस्ट केस:
//JUST AN EXAMPLE, PLEASE USE YOUR OWN PICTURE!
var imageAddr = "http://www.kenrockwell.com/contax/images/g2/examples/31120037-5mb.jpg";
var downloadSize = 4995374; //bytes
function ShowProgressMessage(msg) {
if (console) {
if (typeof msg == "string") {
console.log(msg);
} else {
for (var i = 0; i < msg.length; i++) {
console.log(msg[i]);
}
}
}
var oProgress = document.getElementById("progress");
if (oProgress) {
var actualHTML = (typeof msg == "string") ? msg : msg.join("<br />");
oProgress.innerHTML = actualHTML;
}
}
function InitiateSpeedDetection() {
ShowProgressMessage("Loading the image, please wait...");
window.setTimeout(MeasureConnectionSpeed, 1);
};
if (window.addEventListener) {
window.addEventListener('load', InitiateSpeedDetection, false);
} else if (window.attachEvent) {
window.attachEvent('onload', InitiateSpeedDetection);
}
function MeasureConnectionSpeed() {
var startTime, endTime;
var download = new Image();
download.onload = function () {
endTime = (new Date()).getTime();
showResults();
}
download.onerror = function (err, msg) {
ShowProgressMessage("Invalid image, or error downloading");
}
startTime = (new Date()).getTime();
var cacheBuster = "?nnn=" + startTime;
download.src = imageAddr + cacheBuster;
function showResults() {
var duration = (endTime - startTime) / 1000;
var bitsLoaded = downloadSize * 8;
var speedBps = (bitsLoaded / duration).toFixed(2);
var speedKbps = (speedBps / 1024).toFixed(2);
var speedMbps = (speedKbps / 1024).toFixed(2);
ShowProgressMessage([
"Your connection speed is:",
speedBps + " bps",
speedKbps + " kbps",
speedMbps + " Mbps"
]);
}
}
<h1 id="progress">JavaScript is turned off, or your browser is realllllly slow</h1>
"वास्तविक" गति परीक्षण सेवा के साथ त्वरित तुलना में बड़ी तस्वीर का उपयोग करते समय 0.12 एमबीपीएस का छोटा अंतर दिखाया गया।
परीक्षण की अखंडता सुनिश्चित करने के लिए, आप क्रोम देव टूल थ्रॉटलिंग सक्षम के साथ कोड चला सकते हैं और फिर देख सकते हैं कि परिणाम सीमा से मेल खाता है या नहीं। (श्रेय user284130 :) को जाता है )
ध्यान रखने योग्य महत्वपूर्ण बातें:
उपयोग की जा रही छवि को ठीक से अनुकूलित और संपीड़ित होना चाहिए। यदि ऐसा नहीं है, तो वेब सर्वर द्वारा कनेक्शन पर डिफ़ॉल्ट संपीड़न वास्तव में गति से बड़ा हो सकता है। एक अन्य विकल्प असंपीड़ित फ़ाइल प्रारूप का उपयोग कर रहा है, जैसे कि jpg। ( यह याद दिलाने के लिए राउली राजन्दे और मुझे याद दिलाने के लिए फ्लक्साइन धन्यवाद )
ऊपर वर्णित कैश बस्टर तंत्र कुछ CDN सर्वर के साथ काम नहीं कर सकता है, जिसे क्वेरी स्ट्रिंग मापदंडों की अनदेखी करने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए छवि पर ही कैश कंट्रोल हेडर को बेहतर तरीके से सेट किया जा सकता है। (धन्यवाद के लिए orcaman इस ओर इशारा करते हुए ) )
खैर, यह 2017 है इसलिए अब आपके पास नेटवर्क सूचना एपीआई है (अब तक के ब्राउज़रों में एक सीमित समर्थन के साथ) कुछ प्रकार के अनुमान डाउनलिंक स्पीड जानकारी प्राप्त करने के लिए :
navigator.connection.downlink
यह प्रति सेकंड Mbits में प्रभावी बैंडविड्थ का अनुमान है। ब्राउज़र हाल ही में देखे गए सक्रिय कनेक्शन के माध्यम से हाल ही में देखी गई एप्लिकेशन परत थ्रूपुट से यह अनुमान लगाता है। कहने की जरूरत नहीं है, इस दृष्टिकोण का सबसे बड़ा लाभ यह है कि आपको बैंडविड्थ / गति गणना के लिए किसी भी सामग्री को डाउनलोड करने की आवश्यकता नहीं है।
आप इसे और कुछ अन्य संबंधित विशेषताओं को यहाँ देख सकते हैं
यह ब्राउज़रों में सीमित समर्थन और विभिन्न कार्यान्वयन है करने के लिए (नवंबर 2017) के रूप में, दृढ़ता से सिफारिश करेंगे कारण पढ़ इस विस्तार से
जैसा कि मैं StackOverflow पर यहां इस अन्य उत्तर में रूपरेखा करता हूं , आप विभिन्न आकारों की फ़ाइलों के डाउनलोड को समय से कर सकते हैं (छोटे शुरू करें, अगर यह अनुमति देने के लिए लगता है तो रैंप करें), कैश हेडर के माध्यम से सुनिश्चित करना और इस तरह से फ़ाइल वास्तव में है दूरस्थ सर्वर से पढ़ा जा रहा है और कैश से पुनर्प्राप्त नहीं किया जा रहा है। इसके लिए जरूरी नहीं है कि आपके पास खुद का सर्वर हो (फाइलें S3 या इसी तरह की हो सकती हैं ), लेकिन कनेक्शन गति का परीक्षण करने के लिए आपको फाइलों को प्राप्त करने के लिए कहीं न कहीं जरूरत होगी।
कहा कि, समय-समय पर बैंडविड्थ परीक्षण बहुत ही अविश्वसनीय रूप से अविश्वसनीय हैं, जैसा कि वे अन्य खिड़कियों में डाउनलोड की जा रही अन्य वस्तुओं से प्रभावित होते हैं, आपके सर्वर की गति, लिंक मार्ग, आदि।, लेकिन आप एक मोटा विचार प्राप्त कर सकते हैं। इस तरह की तकनीक का उपयोग करना।
iframe
उदाहरण के लिए, किसी छिपे हुए को सबमिट करते हैं , तो आप iframe
पूर्ण होने के लिए या कुकी को पोल करते हैं । यदि आप XMLHttpRequest
पोस्ट करने के लिए किसी ऑब्जेक्ट का उपयोग करते हैं, तो पूरा होने के लिए कॉलबैक है।
मुझे यह निर्धारित करने के लिए एक त्वरित तरीके की आवश्यकता थी कि क्या उपयोगकर्ता कनेक्शन की गति इतनी तेज़ थी कि मैं जिस साइट पर काम कर रहा हूं, उसमें कुछ सुविधाओं को सक्षम / अक्षम कर सकता हूं, मैंने यह एक छोटी सी स्क्रिप्ट बनाई है, जिसमें एक एकल (छोटी) छवि डाउनलोड करने में लगने वाले समय का औसत कई बार, यह मेरे परीक्षणों में बहुत सटीक रूप से काम कर रहा है, उदाहरण के लिए 3 जी या वाई-फाई के बीच स्पष्ट रूप से भेद करने में सक्षम है, शायद कोई और अधिक सुरुचिपूर्ण संस्करण या यहां तक कि एक jQuery प्लगइन बना सकता है।
var arrTimes = [];
var i = 0; // start
var timesToTest = 5;
var tThreshold = 150; //ms
var testImage = "http://www.google.com/images/phd/px.gif"; // small image in your server
var dummyImage = new Image();
var isConnectedFast = false;
testLatency(function(avg){
isConnectedFast = (avg <= tThreshold);
/** output */
document.body.appendChild(
document.createTextNode("Time: " + (avg.toFixed(2)) + "ms - isConnectedFast? " + isConnectedFast)
);
});
/** test and average time took to download image from server, called recursively timesToTest times */
function testLatency(cb) {
var tStart = new Date().getTime();
if (i<timesToTest-1) {
dummyImage.src = testImage + '?t=' + tStart;
dummyImage.onload = function() {
var tEnd = new Date().getTime();
var tTimeTook = tEnd-tStart;
arrTimes[i] = tTimeTook;
testLatency(cb);
i++;
};
} else {
/** calculate average of array items then callback */
var sum = arrTimes.reduce(function(a, b) { return a + b; });
var avg = sum / arrTimes.length;
cb(avg);
}
}
छवि की चाल शांत है, लेकिन मेरे परीक्षण में यह लोड हो रहा था इससे पहले कि कुछ अजाक्स कॉल मैं पूरा होना चाहता था।
2017 में उचित समाधान एक कार्यकर्ता ( http://caniuse.com/#feat=webworkers ) का उपयोग करना है ।
कार्यकर्ता ऐसा दिखेगा:
/**
* This function performs a synchronous request
* and returns an object contain informations about the download
* time and size
*/
function measure(filename) {
var xhr = new XMLHttpRequest();
var measure = {};
xhr.open("GET", filename + '?' + (new Date()).getTime(), false);
measure.start = (new Date()).getTime();
xhr.send(null);
measure.end = (new Date()).getTime();
measure.len = parseInt(xhr.getResponseHeader('Content-Length') || 0);
measure.delta = measure.end - measure.start;
return measure;
}
/**
* Requires that we pass a base url to the worker
* The worker will measure the download time needed to get
* a ~0KB and a 100KB.
* It will return a string that serializes this informations as
* pipe separated values
*/
onmessage = function(e) {
measure0 = measure(e.data.base_url + '/test/0.bz2');
measure100 = measure(e.data.base_url + '/test/100K.bz2');
postMessage(
measure0.delta + '|' +
measure0.len + '|' +
measure100.delta + '|' +
measure100.len
);
};
जेएस फ़ाइल जो कार्यकर्ता को आमंत्रित करेगी:
var base_url = PORTAL_URL + '/++plone++experimental.bwtools';
if (typeof(Worker) === 'undefined') {
return; // unsupported
}
w = new Worker(base_url + "/scripts/worker.js");
w.postMessage({
base_url: base_url
});
w.onmessage = function(event) {
if (event.data) {
set_cookie(event.data);
}
};
मेरे द्वारा लिखे गए एक पैकेज से लिया गया कोड:
गति का परीक्षण करने के लिए छवियों का उपयोग करना बेहतर है। लेकिन अगर आपको ज़िप फ़ाइलों से निपटना है, तो नीचे दिया गया कोड काम करता है।
var fileURL = "your/url/here/testfile.zip";
var request = new XMLHttpRequest();
var avoidCache = "?avoidcache=" + (new Date()).getTime();;
request.open('GET', fileURL + avoidCache, true);
request.responseType = "application/zip";
var startTime = (new Date()).getTime();
var endTime = startTime;
request.onreadystatechange = function () {
if (request.readyState == 2)
{
//ready state 2 is when the request is sent
startTime = (new Date().getTime());
}
if (request.readyState == 4)
{
endTime = (new Date()).getTime();
var downloadSize = request.responseText.length;
var time = (endTime - startTime) / 1000;
var sizeInBits = downloadSize * 8;
var speed = ((sizeInBits / time) / (1024 * 1024)).toFixed(2);
console.log(downloadSize, time, speed);
}
}
request.send();
यह फ़ाइलों के साथ बहुत अच्छी तरह से काम नहीं करेगा <10MB। आपको एकाधिक डाउनलोड प्रयासों पर समेकित परिणाम चलाना होगा।
मुझे कुछ इसी तरह की जरूरत थी, इसलिए मैंने https://github.com/beradrian/jsbandwidth लिखा । यह https://code.google.com/p/jsbandwidth/ का पुनर्लेखन है ।
यह विचार अजाक्स के माध्यम से दो कॉल करने के लिए है, एक डाउनलोड करने के लिए और दूसरा पोस्ट के माध्यम से अपलोड करने के लिए।
यह दोनों jQuery.ajax
या कोणीय के साथ काम करना चाहिए $http
।
पुनीत एस जवाब के लिए धन्यवाद, गतिशील कनेक्शन गति परिवर्तन का पता लगाने के लिए, आप निम्न कोड का उपयोग कर सकते हैं:
navigator.connection.onchange = function () {
//do what you need to do ,on speed change event
console.log('Connection Speed Changed');
}