我想检查端口是否已打开,或者服务器是否正在运行 我已经尝试过多种方式,例如“/ 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 ..
答案 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
命令的输出,以检查是否在所需端口上侦听某些内容。
因此请使用ProcessBuilder
,netstat
命令和一些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 希望这会有所帮助。