我想检查端口是否打开,或者服务器是否正在其上运行。
我已经以多种方式尝试过,例如“/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..
最佳答案
您无法 ping 特定端口。 “ping”是 ICMP 回显请求。 ICMP 是一个互联网层协议(protocol),因此没有“端口”的概念。
您可以使用Socket
尝试建立到端口的 TCP 连接。如果连接成功,则说明有东西正在监听 TCP 连接。如果无法连接,则说明在某种程度上无法访问。
您可以使用DatagramSocket
尝试将数据包发送到端口。如果成功,则可能有东西正在接收数据。如果失败,则肯定出现了问题(顺便说一句,如果收到发往未对 UDP 开放的端口的 UDP 数据包,或者如果某些东西主动拒绝途中的数据包,则会发回 ICMP 错误消息)。
您必须使用上述两种方法来检查 TCP 和 UDP。
请注意,InetAddress
默认情况下使用 ICMP 请求作为 ping,但如果它没有这样做的权限,它将转而尝试建立 TCP 连接。但是,如果它确实有权生成 ICMP 数据包,则无法强制它尝试 TCP 连接。因此,如果您想使用该方法,只需使用Socket
即可。
关于java - 检查 Android/Java 上的端口是否打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284333/