java - 检查 Android/Java 上的端口是否打开

标签 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..

最佳答案

您无法 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/

相关文章:

android - 在不启动新 Activity 的情况下在 URL 更改(自定义方案)上运行代码

node.js - 无法在heroku中使用socket io

java - 直接在浏览器中使用URL打开JSP页面

java - 一个 Java 库,具有用于查找一组整数的最小公倍数的实用程序

android - 我的 android 模拟器显示倒置的 android 屏幕?任何解决方案

Android 启动应用程序从具有多种服务的 BroadcastReceiver 启动

iOS MDM 配置文件管理器端口使用

c++ - 如何在 linux 上创建虚拟 CAN 端口? (C++)

java - 为什么我的 Java 调度程序无法在 AEM 中运行?

java - 如何解决错误: 'jar' is not recognized as an internal or external command, 可运行程序或批处理文件?