2011-02-10 3 views
7

का उपयोग कर आईपी पतों को पिंग करने के लिए कैसे करें मैं 4 अलग-अलग आईपी पतों को पिंग करने के लिए एक जावास्क्रिप्ट कोड चलाने के लिए और फिर इन पिंग अनुरोधों के पैकेट नुकसान और विलंबता को पुनर्प्राप्त करना चाहता हूं और उन्हें पृष्ठ पर प्रदर्शित करना चाहता हूं।जावास्क्रिप्ट

मैं यह कैसे कर सकता हूं?

+0

[इस सवाल] से संबंधित (http://stackoverflow.com/questions/4954587/getting-client-to-automatically-send-data-to-server)। –

+0

http://stackoverflow.com/questions/4282151/is-it-possible-to-ping-a-server-from-javascript ऊपर समाधान की जांच करनी चाहिए। बहुत चालाक –

उत्तर

16

आप जेएस से ऐसा नहीं कर सकते हैं। क्या तुम कर सकते हो यह है:

client --AJAX-- yourserver --ICMP ping-- targetservers 

अपने सर्वर पर एक AJAX अनुरोध है, जो तब आप के लिए लक्ष्य सर्वर को पिंग करेंगे, और AJAX परिणाम में परिणाम लौटने करें।

संभव चेतावनियां:

  • इससे आपको पता चलता है कि क्या लक्ष्य सर्वर, आपके सर्वर से pingable हैं उपयोगकर्ता का क्लाइंट
    • से नहीं तो ग्राहक मेजबान अपने लैन
    • का परीक्षण करने में सक्षम नहीं होगा
    • लेकिन यदि आप मौजूद हैं
    • कुछ होस्ट कुछ होस्टों से यातायात को अवरुद्ध कर सकते हैं और अन्य नहीं
  • आप प्रति मशीन पिंग गिनती सीमित करने के लिए की जरूरत है:
    • समय बाहर से AJAX अनुरोध से बचने के लिए
    • कुछ साइट ऑपरेटरों बहुत परेशान हो सकता है जब आप अपनी साइटों हर समय पिंग रखने
  • संसाधनों
    • लंबे समय से चल HTTP अनुरोध अपने सर्वर की अधिकतम कनेक्शन सीमा करना पड़ सकता है, जाँच यह कैसे अधिक है
    • कई उपयोगकर्ताओं को एक साथ पिंग करने की कोशिश कर रहा संदिग्ध दिखने यातायात (सभी ICMP और कुछ नहीं) उत्पन्न हो सकता है
  • संगामिति - आप पूल करना चाह सकते हैं/कम से कम कुछ सेकंड के लिए ऊपर/नीचे स्थिति को कैश, इसलिए कि एक ही लक्ष्य को पिंग करने की इच्छा रखने वाले कई ग्राहक पिंग्स की बाढ़ लॉन्च नहीं करेंगे
4

एकमात्र तरीका जिसे मैं सोच सकता हूं लोड हो रहा है उदाहरण के लिए बाहरी सर्वर से एक छवि फ़ाइल। जब वह लोड विफल हो जाता है, तो आप "जानते हैं" सर्वर प्रतिक्रिया नहीं दे रहा है (आप वास्तव में नहीं जानते हैं, क्योंकि सर्वर आपको अवरुद्ध कर सकता है)।

/*note that this is not an ICMP ping - but a simple HTTP request 
    giving you an idea what you could do . In this simple implementation it has flaws 
    as Piskvor correctly points out below */ 
    function ping(extServer){ 
    var ImageObject = new Image(); 
    ImageObject.src = "http://"+extServer+"/URL/to-a-known-image.jpg"; //e.g. logo -- mind the caching, maybe use a dynamic querystring 
    if(ImageObject.height>0){ 
     alert("Ping worked!"); 
    } else { 
     alert("Ping failed :("); 
    } 

} 
+4

यह पिंग नहीं है, यह एक HTTP अनुरोध है (इसलिए टीसीपी/आईपी)। इसके अलावा, अगर लक्ष्य एक HTTP सर्वर नहीं चलता है, अनुरोध एक * loooong * समय टाइम आउट करने के लिए ले जाएगा; प्लस, लोडिंग अतुल्यकालिक है - जब तक कि चित्र कैश, ImageObject में पहले से ही है।यदि आप 'src' सेट करने के बाद सही जांचते हैं तो ऊंचाई 0 वापस आ जाएगी; और यदि यह * कैश में है, तो यह "पिंग काम करता है" वापस करेगा, चाहे लक्ष्य ऊपर है या नहीं। http://en.wikipedia.org/wiki/Ping – Piskvor

+0

आराम Piskvor - आप पूरी तरह से सही हैं कि यह एक वास्तविक पिंग नहीं है (न ही आपका समाधान है) - आपको सॉकेट खोलने और मनमाने ढंग से टीसीपी/आईपी भेजने में सक्षम होना चाहिए एक पिंग अनुकरण करने के लिए पैकेट - मैं बस सादगी के लिए विधि पिंग कहा जाता है। आप यह भी सही हैं कि यदि लक्ष्य HTTP सर्वर नहीं चलाता है तो इसमें काफी समय लगेगा - इसलिए मैंने "एक ज्ञात छवि के लिए यूआरएल" लिखा ... कैशिंग भी एक मुद्दा है। यह एक ** सरल ** एक दृष्टिकोण का प्रदर्शन था जिसे आप ले सकते थे, सीएसएस इतिहास हैक्स के समान सिद्धांत। डाउनवोट के लिए धन्यवाद। –

+0

व्यक्तिगत रूप से डाउनवोट न लें, मैंने * * * को घटाया नहीं है; मुझे लगा कि यह वास्तव में सवाल का जवाब नहीं देता है - हालांकि यह * एक ज्ञात HTTP सर्वर हो सकता है या नहीं, यह जांचने का एक आसान तरीका है, यह वास्तव में पिंग हानि या विलंबता का उत्तर नहीं देता है। मैं मानता हूं कि मेरा दृष्टिकोण क्लाइंट के कंप्यूटर से पिंग नहीं कर रहा है, जिसके लिए बहुत कम अनुमतियां और कई सुरक्षा छेद (और ActiveX) की आवश्यकता होगी। – Piskvor

1
function ping(url){ 
new Image().src=url 
} 

ऊपर पिंग्स दिया यूआरएल:

को देखने के लिए मैं क्या मतलब है इस उदाहरण कोड पर एक नजर डालें।
आमतौर पर काउंटर/विश्लेषण के लिए उपयोग किया जाता है।
यह ग्राहक के लिए असफल प्रतिक्रियाओं का सामना नहीं करेंगे (जावास्क्रिप्ट)

+0

यह आईसीएमपी पैकेट – mulllhausen

+0

नहीं भेजेगा यह जांच करेगा कि कोई सर्वर अनुरोध के जवाब में सर्वर अनुरोध करता है या नहीं। एक पिंग एक पूरी तरह से अलग बात है। –

2

निकटतम आप AJAX उपयोग कर रहा है जे एस में एक पिंग को पाने के लिए जा रहे हैं, और पुन: प्राप्त करने readystates, स्थिति, और हेडर।कुछ इस तरह:

url = "<whatever you want to ping>" 
ping = new XMLHttpRequest();  
ping.onreadystatechange = function(){ 

    document.body.innerHTML += "</br>" + ping.readyState; 

    if(ping.readyState == 4){ 
     if(ping.status == 200){ 
      result = ping.getAllResponseHeaders(); 
      document.body.innerHTML += "</br>" + result + "</br>"; 
     } 
    } 

} 
ping.open("GET", url, true);  
ping.send(); 
बेशक

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

+0

AJAX का उपयोग करने और तैयार राज्यों को पुनर्प्राप्त करने का विचार मेरे लिए काम करता है। क्या मैं कृपया पूछूंगा कि मैं इस सामग्री में अन्य राज्य कैसे जोड़ सकता हूं। जैसे कि यूआरएल उपलब्ध नहीं है, मैं उपयोगकर्ता को मालिश प्रिंट करना चाहता हूं। Document.getElementById ("div") की तरह। आंतरिक HTML = "पिंग सफलता नहीं है!"; –

2

मैं नवीनतम टिप्पणी से प्रेरित था, इसलिए मैंने कोड का यह त्वरित टुकड़ा लिखा।

यह एक प्रकार का "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 अनुरोध के माध्यम से स्थानांतरित डेटा की मात्रा द्वारा समझाया जा सकता है जो वेब सर्वर स्वाद और कॉन्फ़िगरेशन के आधार पर भिन्न हो सकता है, जाहिर है सर्वर की गति और शायद अन्य कारणों से।

यह बहुत अच्छा कोड नहीं है, लेकिन मैंने सोचा कि यह मदद कर सकता है और संभवतः दूसरों को प्रेरित कर सकता है।

-2

आप जावास्क्रिप्ट के साथ पिंग नहीं कर सकते हैं। मैंने जावा सर्वलेट बनाया है जो जीवित होने पर 10x10 पिक्सेल हरी छवि देता है और मृत छवि लाल हो जाती है। https://github.com/pla1/Misc/blob/master/README.md

-1

Is it possible to ping a server from Javascript?

ऊपर समाधान की जांच करनी चाहिए। बहुत चालाक

मेरा नहीं, जाहिर है, लेकिन यह स्पष्ट करना चाहता था।

+0

इस उत्तर को वोट देने से कोई फर्क नहीं पड़ता। सवाल यह था कि जावास्क्रिप्ट का उपयोग करके पिंग कैसे करें, और लिंक आपको जावास्क्रिप्ट का उपयोग करके प्रभावी ढंग से पिंग करने का तरीका दिखाता है। सुनिश्चित नहीं है कि कोई और क्या उम्मीद कर सकता है। हालांकि, प्रतिनिधि की कमी के लिए धन्यवाद, बहुत सराहना की। वाह। –

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