【问题标题】:Check if Port is open on Android/Java检查端口是否在 Android/Java 上打开
【发布时间】:2023-03-07 06:15:01
【问题描述】:

我想检查一个端口是否打开,或者是否有服务器在其上运行。
我已经尝试过多种方式,例如“/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..

【问题讨论】:

  • 请澄清:您的意思是在本地机器上还是在远程机器上打开端口?
  • 没错,我想通过安卓手机检查服务器端口是否打开。
  • 虽然与问题并不真正相关(它可能会导致有效答案的问题,但会因 UI 访问冲突而崩溃),但您不能在线程中使用 textView1.setText(...)。 UI 对象只能由创建它们的线程访问,该线程始终是主线程。您将不得不使用 runOnUiThread 并将 Runnable 传递给它,并在它的 run() 方法中覆盖执行您的 UI 代码
  • 好吧,我猜我应该使用 AsyncTask,但我不知道我的项目是如何进行的。如果有人能给我一个代码,我会很高兴。

标签: java android port ping


【解决方案1】:

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

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

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

您必须同时使用以上两种方法来检查 TCP 和 UDP。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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");
      }
      

      【讨论】:

      • OP 想要检查一个远程端口。
      • 对不起,我误解了这个问题
      【解决方案4】:

      您可以尝试解析netstat 命令的输出,以检查是否有东西在侦听所需的端口。

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

      【讨论】:

      • OP 想要检查一个远程端口。
      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 2011-12-27
      • 2022-01-26
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多