2013-08-17 64 views
2

我想檢查一個端口是打開的還是服務器正在運行。
我已經嘗試了多種方式,像「/系統/斌/平」和「InetAdress」,但如果即時通訊的權利我不能ping通這些指定的端口:/檢查Android/Java上的端口是否打開

這一次我與使它想法DatagramSockets這樣的:

try { String messageStr="Hello!"; 
    int server_port = 25565; 
    DatagramSocket s = new DatagramSocket(); 
    InetAddress local = InetAddress.getByName("11.11.11.11"); 
    int msg_length=messageStr.length(); 
    byte[] message = messageStr.getBytes(); 
    DatagramPacket p = new DatagramPacket(message, msg_length,local,server_port); 
    textView1.setText("Inet"); 
    s.send(p); 
    textView1.setText("Send"); 
} catch (Exception e) {} 

我得到的「Inet」,但沒有「發送」消息,所以我卡住發送。我試圖得到異常消息,它是NetworkOnMainThreadException ..

+0

請說明:您的意思是,如果端口在本地機器上或遠程機器上打開? –

+0

沒錯,我想從一個android手機檢查服務器端口是否打開。 – Caddaile

+0

儘管與問題沒有真正相關性(它可能會導致有效答案發生問題,但在UI訪問衝突時發生崩潰),但不能在線程中使用'textView1.setText(...)'。 UI對象只能由創建它們的線程訪問,而線程始終是主線程。你將不得不使用'runOnUiThread'並傳遞一個'Runnable'給它,並在它的'run()'方法覆蓋執行你的UI代碼 – Tseng

回答

2

您無法ping特定的端口。 「ping」是一個ICMP迴應請求。 ICMP是一種互聯網層協議,因此沒有「端口」的概念。

您可以使用Socket嘗試建立到該端口的TCP連接。如果它連接,那麼有些東西正在偵聽TCP連接。如果它沒有連接,那麼以某種方式無法訪問。

您可以使用DatagramSocket嘗試向該端口發送數據包。如果成功了,那麼有些東西可能正在接收數據。如果失敗了,那麼肯定會出錯(順便說一句,如果收到的UDP數據包發往一個未打開UDP端口的端口,或者如果有東西主動拒絕數據包,則會發回ICMP錯誤消息)。

你必須使用以上兩種方法來檢查TCP和UDP。

請注意,默認情況下,InetAddress使用ICMP請求作爲ping,但如果它沒有權限執行此操作,它將回退嘗試建立TCP連接。但是,如果確實有權生成ICMP數據包,則無法強制它嘗試使用TCP連接。所以如果你想使用這種方法,只需使用Socket

0

您可能會嘗試解析netstat命令的輸出,以檢查是否有某些內容在所需的端口上偵聽。

所以使用ProcessBuilder,netstat命令和一些parsing邏輯。

+0

OP要檢查遠程端口。 –

0
public ServerSocket create_server_socket(InetAddress[] ips, int[] ports) throws IOException { 

    for(InetAddress ip: ips) { 
     for (int port : ports) { 
      try { 
       return new ServerSocket(port,0,ip); 
      } catch (IOException ex) { 
       continue; // try next port 
      } 
     } 
     //try next ip 
    } 

    // if the program gets here, no ip:port in the range was found 
    throw new IOException("no free ip:port found"); 
} 
+0

OP要檢查遠程端口。 –

+0

對不起,我誤解了這個問題 – oldmonk