2012-03-27 17 views
6

Czy jest możliwe wykrycie w JavaScript (w przeglądarce), czy port jest wyłączony przez zaporę lub router?Jak sprawdzić dostępność portu w JavaScript po stronie klienta?

+2

Jaki rodzaj Javascript? W przeglądarce? Na serwerze? Jaki port? Do słuchania lub łączenia? Lokalny czy zdalny? – Thilo

+1

Chcę to wykryć w przeglądarce. Na przykład port 843. –

+0

Mam serwer strategii Flash, ale jeśli port 843 nie jest dostępny, to nie chcę ładować apletu flash. –

Odpowiedz

4

Widać tylko, czy oczekiwana odpowiedź istnieje.

Podczas korzystania z javascript należy trzymać się granic HTTP.

Oczywiście można wysłać żądanie Ajax na dowolnym porcie serwera i sprawdzić, czy wystąpił błąd. Jeśli chcesz sprawdzić port dla bieżącej maszyny, prawdopodobnie wysłanie żądania na "localhost: 843" może pomóc.

Ale błąd może wynikać z innych przyczyn, niekoniecznie z powodu zapory.

Potrzebujemy więcej informacji, aby ci pomóc.

+0

Mam serwer strategii Flash, ale jeśli port 843 jest niedostępny, nie chcę ładować apletu flash. –

4

Nie, z czystym javascriptem nie jest to możliwe (oprócz wysyłania żądań http do konkretnych portów, ale te wyniki niewiele znaczą), można jednak sprawdzić z zewnątrz (innymi słowy serwer), czy określony port jest otwarty. Inną opcją byłoby użycie apletu java lub wtyczki przeglądarki, które mogą zrobić to dla ciebie, jeśli potrzebujesz tego, w takim przypadku są różne narzędzia open source, które prawdopodobnie możesz przenieść, jeśli masz z nimi odpowiednie doświadczenie. Zauważ jednak, że nie jest to dokładnie przyjazne dla użytkownika. (Tak czy inaczej, byłoby użyteczne, gdybyś opisał dokładny scenariusz, w którym jest to potrzebne, ponieważ może istnieć zupełnie inne rozwiązanie.)

+0

Mam serwer strategii Flash, ale jeśli port 843 nie jest dostępny, to nie chcę ładować apletu flash. –

+0

W takim przypadku radzę załadować aplet flash i wykonać wywołanie zwrotne do strony, jeśli nie może on funkcjonować, a następnie przesłać informację zwrotną do użytkownika (w takim przypadku chodzi o funkcję flash, a nie javascript, gdzie to nie jest ". możliwe) (i nie wiem, co dokładnie jest i nie jest możliwe w pamięci flash). –

3

Jeśli jesteś wystarczająco elastyczny, aby używać jQuery, zobacz to Answer by me. To sprawdzi nie tylko dostępność portu, ale także to, czy kod odpowiedzi powodzenia 200 pochodzi z serwera zdalnego (lub dowolnego, co oznaczało, że obsługuje również domenę międzydomenową). Podaje również rozwiązanie tutaj. Będę sprawdzać tutaj dla portu 843.

<!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

To skłoniło mnie do sprawdzenia, czy ta metoda miałaby zastosowanie do problemu, który miałem, gdy próbowaliśmy pingować port, który może nie mieć odbiornika po drugiej stronie. Problem polegał na tym, że kiedy nie było odbiornika, Chrome zawsze logował błąd nawet po zawarciu żądania xhr w próbie/catch .. nie zabójca, ale wciąż brzydki. Przez usunięcie bloków sukcesu i błędów oraz obsługę odpowiedzi w całym bloku, tak jak tutaj, uniknęliśmy komunikatu konsoli! Byłem w stanie to zrobić również z połączeniem asynchronicznym. Dzięki za kod. – likestoski

Powiązane problemy