2009-02-02 6 views
13

मैं कुछ गेम सुरंग सर्वर चलाता हूं और एक ऐसा पृष्ठ चाहता हूं जहां क्लाइंट सभी सर्वरों पर एक पिंग चला सके और सबसे अधिक प्रतिक्रियाशील हो। जहां तक ​​मैं देख सकता हूं कि जावास्क्रिप्ट में ऐसा करने का कोई उचित तरीका नहीं है, लेकिन मैं सोच रहा था, क्या कोई फ़्लैश या किसी अन्य क्लाइंट ब्राउज़र तकनीक में ऐसा करने का तरीका जानता है?ब्राउज़र के माध्यम से रिमोट सर्वर की विलंबता को निर्धारित करने के लिए

+0

मुझे आपके समाधान के बारे में काफी दिलचस्पी है। कुछ परिणाम पाने का कोई मौका? अग्रिम में धन्यवाद ! –

+0

मेरे लिए सबसे दिलचस्प जवाब एलिरम (http://stackoverflow.com/questions/503199/how-to-determine-latency-of-a-remote-server-through-the-browser/575542#575542 द्वारा किया गया था), लेकिन StackOverflow पहले से ही मेरे लिए जवाब चुना है। हालांकि मैंने इस परियोजना को और भी आगे नहीं बढ़ाया है। मैं फ्लैश देव –

उत्तर

17

जावास्क्रिप्ट समेत अधिकांश एप्लेट प्रौद्योगिकी, एक ही मूल नीति लागू करती है। छवियों जैसे डीओएम तत्वों को गतिशील रूप से जोड़ना संभव हो सकता है, और ऑनलोड ईवेंट हैंडलर का उपयोग करके समय की जानकारी एकत्रित करना संभव हो सकता है।

छद्म-कोड

for (server in servers) { 
    var img = document.createElement('IMG'); 
    server.startTime = getCurrentTimeInMS(); 
    img.onload=function() { server.endTime = getcurrentTimeInMS(); } 
    img.src = server.imgUrl; 
} 

फिर एक उपयुक्त समय प्रतीक्षा करें और प्रत्येक सर्वर ऑब्जेक्ट के लिए समय की जाँच करें। यदि आप चाहें तो आवश्यक और गणना औसत के रूप में दोहराएं। मुझे यकीन नहीं है कि आप किस प्रकार की सटीकता की उम्मीद कर सकते हैं।

नुकसान:

  • आप शायद इस काम के लिए गलत उपकरण का उपयोग कर रहे हैं। एक ब्राउज़र इस तरह के आवेदन के लिए सुसज्जित नहीं है।
  • यह शायद काफी गलत है।
  • यदि आपके द्वारा अनुरोधित संसाधन कैश किया गया है तो यह आपको वह परिणाम नहीं देगा जो आप चाहते हैं, लेकिन आप हर बार यूआरएल बदलकर उस पर काम कर सकते हैं।
  • यह सामान्य पिंग की तुलना में बैंडविड्थ-गहन है। छवि को छोटा बनाएं, जैसे spacer.gif फ़ाइल।
  • समय न केवल रिमोट सर्वर की विलंबता पर निर्भर करता है बल्कि उस सर्वर की बैंडविड्थ पर निर्भर करता है। यह एक कम या कम उपयोगी उपाय हो सकता है लेकिन यह ध्यान रखना महत्वपूर्ण है कि यह केवल विलंबता नहीं है।
  • आपको विभिन्न सर्वरों से HTTP अनुरोधों को पूरा करने में सक्षम होना चाहिए और, महत्वपूर्ण रूप से, प्रत्येक सर्वर को सटीक संसाधन (या समान लंबाई का संसाधन) देना चाहिए। सर्वर पर स्थितियां प्रतिक्रिया समय को प्रभावित कर सकती हैं, जैसे कि एक सर्वर डेटा को संपीड़ित कर रहा है और दूसरा नहीं है।
+0

संपूर्ण डोम-ऑब्जेक्ट बनाने के बजाय नई छवि() का उपयोग करें। –

+0

@gs: क्या नई छवि() का उपयोग करने का कोई फायदा है? –

+0

इन सभी समाधानों में समस्या जिसमें कुछ डाउनलोड करना शामिल है, यह है कि यह वास्तव में वेब सर्वर की गति का परीक्षण कर रहा है, न कि नेटवर्क कनेक्शन की विलंबता। तो यह वास्तव में एक वास्तविक प्रतिबिंब नहीं है, खासकर मेरी जरूरतों के लिए जो बहुत विशिष्ट नेटवर्क विलंबता गति के लिए हैं। –

2

यदि आप कुछ क्लाइंट पक्ष चलाने के बारे में बात कर रहे हैं, तो मुझे यकीन नहीं है कि सुरक्षा कारणों से यह संभव है।

शायद आपकी सबसे अच्छी शर्त जावा एप्लेट होगी - लेकिन फिर इसे स्थानीय सुरक्षा नीति के खिलाफ जांचना होगा।

यदि मैं ऐसा करने के लिए जेएस में कुछ हैक के बारे में सोचने की कोशिश करता हूं, तो आप कॉलबैक फ़ंक्शन के साथ एसिंक अनुरोध भेजने का प्रयास कर सकते हैं जो मिलीसेकंड को मापता है - लेकिन यह मेरे सिर के ऊपर से है।

+0

नहीं हूं, मुझे पता है कि एक तरीका है कि मैं एक हेड अनुरोध भेजकर कर सकता हूं, लेकिन मुझे उम्मीद थी कि फ़्लैश का उपयोग करके ऐसा करने का कोई तरीका है? –

+0

जावा एप्लेट को केवल अपने मूल सर्वर से संपर्क करने की अनुमति है। – Magnar

+0

यदि वे हस्ताक्षरित और स्वीकार किए जाते हैं तो अधिक अनुमत सुरक्षा वाले एप्लेट को अनुमति दी जाती है। या कम से कम वे थे। आखिरी बार मैंने देखा कि नेटस्केप 4 के साथ था। –

1

समस्या 'फ़ाइल पिंग्स' के साथ कि आप जबकि आपकी सेवा के एक बहुत अलग व्यवहार और इस प्रकार एक अलग विलंबता हो सकता है खेल के लिए अपने लक्ष्य संसाधन http सर्वर प्रतिक्रिया का मूल्यांकन होता है।

वास्तविक संदर्भ के आधार पर नीले रंग से शायद एक अवास्तविक भी हो सकता है: लेकिन, क्या गेम स्क्रिप्ट के दौरान सर्वर द्वारा निष्पादित कार्यों के संक्षिप्त अनुक्रम के आधार पर सर्वर स्क्रिप्ट बनाना दिलचस्प नहीं होगा (उदाहरण के लिए एक आरटीएमपी कनेक्शन खोलना, एक जानकारी पुनर्प्राप्त करना, इसे वापस भेजना)। सर्वर की कुल संख्या के आधार पर, आप उन्हें लगभग एक साथ खोल सकते हैं और विजेता के रूप में पहली प्रतिक्रिया को परिभाषित कर सकते हैं (उस समय को घटाकर जब आपके ग्राहक को प्रत्येक क्वेरी को संसाधित करने के लिए स्वतंत्र रूप से आवश्यकता होती है)।

बेशक यह एक महंगी विधि सर्वर-साइड-बोलिंग है, लेकिन कम से कम आप उम्मीद करेंगे कि एक विश्वसनीय परिणाम (सर्वर और नेटवर्क विलंबताएं सारांशित हों)। यहां तक ​​कि यदि मूल्यांकन करने में कुछ सेकंड लगते हैं, तो यह कुल आनंददायक गेम-प्ले के एक अंश का विषय होगा।

6

सर्वर से कॉल से पहले, रिकॉर्ड जावास्क्रिप्ट समय:

var startTime = new Date(); 

लोड सर्वर से एक छवि:

var img = new Image() 
img.onload = function() { 
    // record end time 
} 
img.src = "http://server1.domain.com/ping.jpg"; 

जैसे ही अनुरोध समाप्त हो गया है, समय फिर से दर्ज करते हैं। (। बेशक उस अनुरोध टाइम आउट नहीं किया था की यह देखते हुए)

var endTime = new Date(); 

मिलीसेकेंड में आपका पिंग है:

var ping = endTime. getTime() - startTime.getTime(); 
5

तुम सब वास्तव में जरूरत के समय पर, कनेक्शन शुरू से ही समय है पहला तैयार स्थान परिवर्तन ...

 
function getPing() { 
    var start; 
    var client = getClient(); // xmlhttprequest object 
    client.onreadystatechange = function() { 
    if (client.readyState > 0) { 
     pingDone(start); //handle ping 
     client.onreadystatechange = null; //remove handler 
    } 
    } 

    start = new Date(); 
    client.open("HEAD", "/ping.txt"); //static file 
    client.send(); 
} 

function pingDone(start) { 
    done = new Date(); 
    ms = done.valueOf() - start.valueOf(); 
    alert(ms + "ms ping time"); 
} 

function getClient() { 
    if (window.XMLHttpRequest) 
    return new XMLHttpRequest(); 

    if (window.ActiveXObject) 
    return new ActiveXObject('MSXML2.XMLHTTP.3.0'); 

    throw("No XMLHttpRequest Object Available."); 
} 
+0

यह केवल तभी काम करेगा जब आप वेबपृष्ठ को होस्ट करने वाले सर्वर को पिंग कर रहे हैं, न कि अन्य सर्वरों को पिंग करने के लिए। –

2

फ्लैश में सर्वर प्रतिक्रिया समय को मापना मुश्किल नहीं है।

फ्लैश को दूरस्थ सर्वर तक पहुंचने से पहले नीति फ़ाइल के लिए पूछना चाहिए। (आप आसानी से crossdomain फ़ाइल स्वरूप के बारे में जानकारी प्राप्त कर सकते हैं)

/crossdomain.xml

के बाद से इस तरह के फ़ाइल की जरूरत है वैसे भी, क्यों नहीं: इस तरह के नीति फ़ाइल के लिए डिफ़ॉल्ट स्थान सर्वर के रूट फ़ोल्डर में है सर्वर प्रतिक्रिया समय को मापने के लिए इसका इस्तेमाल करें? फ़ाइल के बजाय फ़ाइल को लोड करें और getTimer() का उपयोग करके किए गए समय को मापें।

यह आपको HTTP कनेक्शन पर एक अच्छा अनुमान देगा।

लेकिन यदि आप गेम सर्वर से निपट रहे हैं, तो आप सीधे टीसीपी कनेक्शन की गति जांचना चाहेंगे। ऐसा करने के लिए आपको flash.net.Socket का उपयोग करने की आवश्यकता होगी आपको पहले पॉलिसी फ़ाइल के लिए भी पूछना होगा: Security.loadPolicyFile ("xmlsocket: //server.domain.com: 5342") ;

जहां 5342 आपके सर्वर के पोर्ट नंबर का प्रतिनिधित्व करता है जहां इसे उचित XML नीति स्ट्रिंग के साथ जवाब देना चाहिए। सॉकेट कनेक्शन बनाने के बाद, कोई भी अनुरोध/प्रतिक्रिया आपको विभिन्न सर्वर प्रतिक्रिया समयों को मापने देगी।

http://magnetiq.com/exports/server_ping.png

दो कॉलम के साथ एक मेज (जरूरी नहीं शाब्दिक <table> अर्थ में) बनाएँ:

+0

यह काफी आशाजनक लगता है। क्या आपके पास कुछ कोड है, या एक उदाहरण फ्लैश "एप्लेट" मैं देख सकता हूं? मैं खुद एक एक्शनस्क्रिप्ट प्रोग्रामर नहीं हूं। –

3

यहाँ एक तरीका है। पहले कॉलम में सर्वर का नाम होगा (और संभवतः उनसे लिंक)। दूसरे कॉलम में iframes हैं जो संबंधित सर्वर से जांच दस्तावेज़ लोड करते हैं।प्रत्येक जांच दस्तावेज़ प्रारंभिक लाने का अनुरोध पर इस करता है: मौजूदा सिस्टम का समय

  • एक दूसरे जांच दस्तावेज़ में एक रीडायरेक्ट (302) क्या

    1. जाओ, जबकि एक क्वेरी पैरामीटर
    2. दूसरी जांच के रूप में सिस्टम का समय गुजर दस्तावेज़ वर्तमान सिस्टम समय को पढ़ता है, प्रारंभिक पढ़ने से डेल्टा की गणना करता है जो इसे पारित किया गया था और इसे बड़े वसा अक्षरों में प्रदर्शित करता है। यह डेल्टा उस समय होगा जब सर्वर को रीडायरेक्ट प्रतिक्रिया के साथ क्लाइंट को जवाब देने के लिए लिया जाएगा और क्लाइंट के लिए पुनर्निर्देशन लक्ष्य के लिए दूसरा अनुरोध करने के लिए समय लगेगा। यह वास्तव में एक "पिंग" नहीं है लेकिन यह प्रत्येक सर्वर के साथ ग्राहक की सापेक्ष विलंबता का तुलनीय उपाय है। वास्तव में, यह सर्वर से क्लाइंट तक "रिवर्स पिंग" है।

    आप समान डोमेन नीति का उल्लंघन किए बिना iframes का उपयोग करेंगे क्योंकि iframe सामग्री में हेरफेर करने का कोई प्रयास नहीं है। खिलाड़ी केवल अपनी आंखों के साथ मूल्यों को देखेगा और आप संख्याओं पर उपयोगकर्ता चमकते हुए और सर्वर लिंक पर क्लिक करने पर भरोसा करेंगे जो सबसे अधिक समझ में आता है।

  • 2

    ध्यान रखें कि विलंबता मापने के लिए आप एक टीसीपी क्वेरी बनाने के अंत में विलंबता कम से कम दो बार होने जा रहे हैं, क्योंकि आपको तीन तरह के हैंडशेक और समाप्ति की आवश्यकता होगी कम से कम पैकेट (एक के बजाय दो दौर यात्राएं)। यदि आप HTTP अनुरोध करते हैं, तो शीर्षलेख को न्यूनतम रखने की कोशिश करें। एक लंबे समय तक पर्याप्त हेडर (क्लाइंट पर एक चतुर सर्वर, या कुकीज़ इत्यादि के कारण) मिश्रण में अतिरिक्त राउंड ट्रिप जोड़ सकते हैं, जिससे आप अपने माप को फेंक सकते हैं।

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