2012-01-20 49 views
5

這最後解決了jQuery AJAX(和JSONP)的「超時」屬性。看到我自己的答案!如何檢查端口是否在客戶端的網絡/防火牆中打開?

請參閱更新的部分,我也嘗試過使用小應用程序。如果你可以給applet實現一個解決方案,會毫不猶豫地接受你的答案。

我正在使用基於Java的Web應用程序。我的要求是檢查某個端口(如1935)是否在客戶端打開或阻塞。我已經實現了一個「jsonp」(爲什麼'jsonp'?我發現通過AJAX'http'請求不能用於瀏覽器的同源策略的corssdomain')AJAX調用包含特定端口的服務器之一。如果服務器返回xhr.status == 200端口已打開。這是一個缺點,在調用完成之前,我無法進行執行流等待(同步)。這是我正在使用的JavaScript函數。

也歡迎任何替代解決方案(必須是客戶端的東西必須與我的應用程序並行,請不要提示python/php /其他語言)。謝謝你的時間。

function checkURL() { 

    var url = "http://10.0.5.255:1935/contextname" ; 
    var isAccessible = false; 

    $.ajax({ 
     url: url, 
     type: "get", 
     cache: false, 
     dataType: 'jsonp', 
     crossDomain : true, 
     asynchronous : false, 
     jsonpCallback: 'deadCode', 
     complete : function(xhr, responseText, thrownError) { 
      if(xhr.status == "200") { 
       isAccessible = true; 
       alert("Request complete, isAccessible==> " + isAccessible); // this alert does not come when port is blocked 
      } 
     } 
    }); 

    alert("returning isAccessible=> "+ isAccessible); //this alert comes 2 times before and after the AJAX call when port is open 
    return isAccessible; 

} 

function deadCode() { 
    alert("Inside Deadcode"); // this does not execute in any cases 
} 

------------------------------------------ --------------- UPDATE ---------------------------------- ------------------------------

我試過用Java Applet(感謝Y Martin的建議)。這在appletviewer中工作正常。但是,當我在HTML頁面中添加小程序時,它給出了易受攻擊的結果。從某種意義上來說,這很脆弱,當我改變標籤或調整瀏覽器大小時,portAvailable的值在打印的信息中被改變。

applet代碼:

import java.applet.Applet; 
import java.awt.Graphics; 
import java.net.InetSocketAddress; 
import java.net.Socket; 

public class ConnectionTestApplet extends Applet { 
    private static boolean portAvailable; 
    public void start() { 
     int delay = 1000; // 1 s 
     try { 
      Socket socket = new Socket(); 
       /*****This is my tomcat5.5 which running on port 1935*************/ 
       /***I can view it with url--> http://101.220.25.76:1935/**********/ 
      socket.connect(new InetSocketAddress("101.220.25.76", 1935), delay); 
      portAvailable = socket.isConnected(); 
      socket.close(); 
      System.out.println("init() giving---> " + portAvailable); 
     } 
     catch (Exception e) { 
      portAvailable = false; 
      System.out.println("init() giving---> " + portAvailable); 
      System.out.println("Threw error---> " + e.getMessage()); 
     } 

    } 
    public void paint(Graphics g) { 
     System.out.println("Connection possible---> " + portAvailable); 
     String msg = "Connection possible---> " + portAvailable; 
     g.drawString(msg, 10, 30); 
    } 
} 

,這是我的HTML頁面(我收留了它同一臺計算機上使用不同的Tomcat 6,運行在端口9090我可以鏈接查看此頁面--->http://101.220.25.76:9090/test/):

<html> 
<body> 
     <applet code="ConnectionTestApplet" width=300 height=50> 
     </applet> 
</body> 
</html> 

怎麼我做了1935端口阻斷和開通?

我爲端口1935的入站和出站都創建了防火牆規則。 我通過禁用/啓用兩個規則來檢查端口1935打開/阻塞情況。

這是我的S.S.C.C.E。現在請幫助我:)

+1

您的代碼不僅測試「端口」是否打開,而且還有服務器應答HTTP請求。你的代碼是否需要在瀏覽器中運行?可能是你的Java解決方案嗎? –

+0

Applet是一個選項,它取決於我想要避免的瀏覽器的Java插件的可用性。我已經設置了一個服務器,該服務器在1935端口應答,無論是協議(是的,它是HTTP)。我也得到了答覆(當端口打開時)。但是如果端口在客戶端被阻塞,我該如何聽呢?這是點 – tusar

+0

@ YvesMartin,你可以請回答關於小程序或任何其他實施?是的,我希望代碼在瀏覽器上執行。請幫我解決一下這個。 – tusar

回答

4

Gotcha !!!我用JSONP和jQuery AJAX調用解決了我的問題。我發現了jQuery AJAX的timeout屬性,當端口被阻止或打開時,我的代碼可以流暢地執行。這是未來訪客的解決方案。感謝所有回答者的貢獻。

<!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() { 
       var url = "http://101.212.33.60:1935/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, esecute 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

太棒了!我幾乎可以肯定這個「超時」選項是由於JS「setTimeout」 –

+0

謝謝指出,我很高興大家都看到這是「最佳答案」,這是正確的,點和不言自明沒有像其他答案一樣的隱藏信息,一半在意見中,一半在評論中......多麼混亂!我不會忘記SO這種可恥的局面。 – tusar

+0

我同意你的意見。我應該將我從JavaScript和Java經驗中所知道的「超時」想法轉化爲jQuery API,而不是遵循其他答案的路徑......我希望我也瞭解了它。 –

2

我不認爲你理解JSONP的用例,並且不可能用它來測試打開的端口。 http://en.wikipedia.org/wiki/JSONP

如果你想要一個客戶端解決方案,它可以使用websockets,但這隻適用於像chrome或ff這樣的新瀏覽器。否則,請求執行ping的服務器端腳本。例如 - 使用捲曲腳本:curl and ping - how to check whether a website is either up or down?

+0

我忘了用java標記它。我不能使用'curl'。這是PHP的權利?如果我錯了,請原諒我。其他解決方案? – tusar

+0

在Java中,您可以使用URL或Socket類更好地進行網絡連接:http://stackoverflow.com/questions/3584210/preferred-java-way-to-ping-a-http-url-for-availability –

+0

Ya ,明白了你的意思。看到Java代碼將在服務器中執行。對?我將永遠打開港口。但這是客戶端的問題,在其網絡中端口可能被阻塞。在這些情況下,我不能運行除JavaScript以外的任何內容。 – tusar

1

您不能在JavaScript中執行此操作,因爲它沒有真正的套接字支持,只能使用JavaScript測試是否存在HTTP套接字。您可以使用Java(JavaScript不是Java)並編寫適當的Java Applet來執行此操作。

你也應該閱讀這Q&A How to Ping in java

嘗試使用isReachable

+0

首先感謝您的時間。沒有人在看這個......很傷心。你想給我一個小程序的例子。我確實試圖設計一個,但它導致了一團糟。你能給我提供一個例子/參考嗎? – tusar

+0

一個更新,我的小應用程序在applet-viewer中給出了正確的結果(關於端口的可用性),但是在瀏覽器中它的緩存結果我猜。任何建議? – tusar

+0

嗨,我已經用結果更新了這個問題,可否請您看看? – tusar

0

在JavaScript中,你必須工作,周圍的異步問題。這裏有一個建議:

  • 的HTML頁面顯示的動畫形象進度條
  • 您調用checkURL
  • 要麼接受回調或定義的超時之後,您更改顯示的錯誤信息或做與工作基礎上following document與使用XMLHttpRequest

,這裏是checkURL一個代碼示例:

var myrequest = new ajaxRequest(); 
var isAccessible = false; 
myrequest._timeout = setTimeout(function() { 
     myrequest.abort(); 
     displayErrorMessage(); 
    }, 
    1000 
    ) //end setTimeout 
myrequest.onreadystatechange = function() { 
    if (myrequest.readyState == 4) { //if request has completed 
     if (myrequest.status == 200) { 
     isAccessible = false; 
     goOnWithTheJob(); 
     } else { 
     displayErrorMessage(); 
     } 
    } 
myrequest.open("GET", url, true); 
myrequest.send(null); //send GET request 
// do nothing - wait for either timeout or readystate callback 

此代碼允許1秒鐘從基本資源上的HTTP GET獲取200響應。

在您的本地測試中,您會立即得到答案,因爲系統應答連接重置如果端口已關閉但防火牆無法應答。

即使open方法可以同步使用,我建議使用一個計時器的,因爲代碼很可能等待TCP超時和重試(3×1分鐘?)作爲防火牆通常只是丟棄數據包上關閉端口,並可能拒絕ICMP數據包,導致您無法測試可用性,這要歸功於ping。我想像這樣一個漫長的等待並不期望這樣的檢查。

+0

我覺得暫停可能不是一個好主意。我將試用JSON-P(正如我指定我需要跨域)。很快會回覆你。謝謝你的時間。 – tusar

+0

爲什麼「不是個好主意」?它足以測試服務器/端口的可用性。我已經使用這樣的代碼爲一個複雜的HTML/JavaScript客戶端支持在線/離線模式與常規連接重試和進度條爲用戶...所以請考慮它和測試 –

1

可以使用閃存組件而不是小應用程序。使用ActionCcript中提供的Socket類可以打開從閃存到服務器端口的tcp連接,以檢查它是否打開。但是基於Flash播放器版本,策略文件需要放置在打開套接字的服務器上。

+0

嗨阿里,我不做閃存文件。如果有的話,你可以請分享嗎?我認爲這應該是做到這一點的最佳方式。 – tusar

+0

嗨,我已經更新了問題的結果,請你看看? – tusar

2

這裏是一個Java代碼作爲一個小程序來測試服務器/端口的連接:

import java.io.*; 
import java.net.*; 

public class ConnectionTestApplet extends Applet { 
    public void start() { 
     boolean portAvailable = false; 
     int delay = 1000; // 1 s 
     try { 
      Socket socket = new Socket(); 
      socket.connect(new InetSocketAddress("server.domain.com", 1935), delay); 
      portAvailable = socket.isConnected(); 
      socket.close(); 
     } catch (UnknownHostException uhe) { 
      uhe.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
     System.out.println("Connection possible: " + portAvailable); 
    } 
} 

你仍然需要得到信息的小程序做別的事情與結果。最簡單的方法是瀏覽器感謝重定向到getAppletContext().showDocument(url)

+0

嗨馬丁,我已經試過這個,並更新了問題的結果,請你看看? – tusar

1

檢查了這一點:

http://blog.andlabs.org/2010/12/port-scanning-with-html5-and-js-recon.html

隨着JS-偵察,你可以做端口掃描與JavaScript。您可以簡單地將它指向您的本地IP地址。我相信它的工作方式是通過將網絡套接字/ cors連接到任意desintation ip/socket並測量超時。這不是一個完美的方法,但這可能是JavaScript的最終限制。

如果你可以在java applet/flash應用程序中完成它,那麼最終可能會更好,因爲它們具有較低級別的訪問權限。

+0

我發誓我沒聽說過。並感謝上一段中的好想法。我當然會看看這些API。非常感謝你。如果您有興趣瞭解我如何解決我的問題,請參閱我自己的答案! – tusar