检查端口是否在Android / Java上打开

时间:2013-08-17 01:50:18

标签: java android port ping

我想检查端口是否已打开,或者服务器是否正在运行 我已经尝试过多种方式,例如“/ system / bin / ping”和“InetAdress”,但是如果我正确的话我不能用这些来ping一个指定的端口:/

这次我使用了像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 ..

4 个答案:

答案 0 :(得分:2)

您无法ping特定端口。 “ping”是ICMP回送请求。 ICMP是一种互联网层协议,因此没有“端口”的概念。

您可以使用Socket尝试建立与端口的TCP连接。如果它连接,那么有些东西正在侦听TCP连接。如果它没有连接,那么它在某种程度上是无法访问的。

您可以使用DatagramSocket尝试将数据包发送到端口。如果成功,那么某些东西可能正在接收数据。如果它失败了,那么肯定会出现问题(顺便提一下,如果收到的UDP数据包发送到UDP不开放的端口,或者某些东西在途中主动拒绝该数据包,则会发回ICMP错误消息)。

您必须同时使用上述两项来检查TCP和UDP。

请注意,默认情况下InetAddress使用ICMP请求作为ping,但如果它没有这样做的权限,则会尝试建立TCP连接。但是,如果 具有生成ICMP数据包的权限,则无法强制它尝试TCP连接。因此,如果您想使用该方法,只需使用Socket

答案 1 :(得分:0)

您可以尝试解析netstat命令的输出,以检查是否在所需端口上侦听某些内容。

因此请使用ProcessBuildernetstat命令和一些parsing逻辑。

答案 2 :(得分: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");
}

答案 3 :(得分:0)

不要试图找到开放端口或服务器运行,只需让服务器广播服务并侦听来自客户端的回复,请检查以下链接:http://home.heeere.com/tech-androidjmdns.html 希望这会有所帮助。