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

我想检查端口是否打开,或者服务器是否正在运行。
我已经尝试过多种方式,例如“/ 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”,但没有“发送”消息,所以我被困在发送。 我试图获取exception消息,它是NetworkOnMainThreadException ..

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

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

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

您必须使用上述两者来检查TCP和UDP。

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

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

所以使用ProcessBuildernetstat命令和一些parsing逻辑。

 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"); } 

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