2012-03-27 11 views
6

Ist es möglich, in JavaScript (im Browser) zu erkennen, ob ein Port von der Firewall oder dem Router deaktiviert ist?Wie überprüft man die Verfügbarkeit von Ports im clientseitigen JavaScript?

+2

Welche Art von Javascript? Im Browser? Auf dem Server? Welche Art von Hafen? Zum Anhören oder Verbinden? Lokal oder entfernt? – Thilo

+1

Ich möchte es in einem Browser erkennen. Zum Beispiel der Port 843. –

+0

Ich habe einen Flash-Policy-Server, aber wenn der Port 843 nicht verfügbar ist, möchte ich das Flash-Applet nicht laden. –

Antwort

4

Sie können nur sehen, ob die erwartete Antwort da ist oder nicht.

Man muss in den Grenzen von HTTP bleiben, wenn man Javascript benutzt.

Natürlich können Sie eine Ajax-Anfrage auf jedem Port des Servers senden und sehen, ob Sie einen Fehler erhalten. Wenn Sie den Port nach dem aktuellen Rechner überprüfen möchten, könnte das Senden einer Anfrage auf "localhost: 843" helfen.

Aber der Fehler könnte aus anderen Gründen und nicht unbedingt Firewall-Problem sein.

Wir benötigen mehr Informationen, um Ihnen zu helfen.

+0

Ich habe einen Flash-Policy-Server, aber wenn der Port 843 nicht verfügbar ist, möchte ich das Flash-Applet nicht laden. –

4

Nein, mit reinem Javascript ist das nicht möglich (abgesehen von HTTP-Anfragen an die spezifischen Ports, aber diese Ergebnisse bedeuten wenig), was Sie tun können, ist jedoch von außen (mit anderen Worten Ihr Server) zu überprüfen, ob spezifischer Port ist offen. Eine andere Option wäre, ein Java-Applet oder Browser-Plugin zu verwenden, das dies für Sie tun könnte, wenn Sie es benötigen, in diesem Fall gibt es verschiedene Open-Source-Tools, die Sie wahrscheinlich portieren könnten, wenn Sie die erforderliche Erfahrung mit denen haben. Beachten Sie jedoch, dass dies nicht gerade benutzerfreundlich ist. (In jedem Fall wäre es nützlich, wenn Sie das genaue Szenario beschreiben würden, in dem Sie dies benötigen, da es möglicherweise eine ganz andere Lösung gibt.)

+0

Ich habe einen Flash-Policy-Server, aber wenn der Port 843 nicht verfügbar ist, möchte ich das Flash-Applet nicht laden. –

+0

In diesem Fall würde ich Ihnen raten, das Flash-Applet zu laden, und einen Rückruf auf Ihre Seite zu machen, wenn es nicht funktioniert und das Feedback dem Benutzer als nächstes zu dienen (in diesem Fall geht es um Flash-Funktionalität statt Javascript, wo dies nicht ist) t möglich) (und ich weiß nicht, was im Flash genau möglich ist und was nicht möglich ist.). –

3

Wenn Sie flexibel genug sind, jQuery zu verwenden, finden Sie unter Answer by me. Dies überprüft nicht nur die Verfügbarkeit des Ports, sondern auch, ob ein Erfolgs-Response-Code 200 von dem entfernten Server kommt (oder irgendeinen, ich meine, er unterstützt auch domänenübergreifenden Server). Auch hier die Lösung geben. Ich werde hier nach Port 843 überprüfen.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
     <script type="text/javascript" src="jquery-1.7.2-min.js"></script> 
    </head> 
    <body> 
     <script type"text/javascript"> 
      var isAccessible = null; 
      function checkConnection() { 
    /*make sure you host a helloWorld HTML page in the following URL, so that requests are succeeded with 200 status code*/ 
       var url = "http://yourserverIP:843/test/hello.html" ; 
       $.ajax({ 
        url: url, 
        type: "get", 
        cache: false, 
        dataType: 'jsonp', // it is for supporting crossdomain 
        crossDomain : true, 
        asynchronous : false, 
        jsonpCallback: 'deadCode', 
        timeout : 1500, // set a timeout in milliseconds 
        complete : function(xhr, responseText, thrownError) { 
         if(xhr.status == "200") { 
          isAccessible = true; 
          success(); // yes response came, execute success() 
         } 
         else { 
          isAccessible = false; 
          failure(); // this will be executed after the request gets timed out due to blockage of ports/connections/IPs 
         } 
        } 
       }); 
      } 
      $(document).ready(function() { 
       checkConnection(); // here I invoke the checking function 
      }); 
     </script> 
    </body> 
</html> 
+0

Dies veranlasste mich, zu sehen, ob diese Methode auf ein Problem angewendet werden würde, das ich hatte, wo wir versuchten, einen Port zu pingen, auf dem auf der anderen Seite kein Listener läuft. Das Problem war, dass, wenn es keinen Zuhörer gab, Chrome immer einen Fehler protokollierte, selbst wenn die xhr-Anfrage in einen try/catch geschrieben wurde. Kein Mörder, aber immer noch hässlich. Durch das Entfernen der Erfolgs- und Fehlerblöcke und die Behandlung der Antwort im kompletten Block, wie hier, haben wir die Konsolennachricht vermieden! Ich konnte dies auch mit einem asynchronen Anruf tun. Danke für den Code. – likestoski