【问题标题】:Check what ports are being used检查正在使用的端口
【发布时间】:2011-06-24 13:20:17
【问题描述】:

如何查看某个 IP 地址的服务在哪些端口运行。 (请用java代码)

编辑:我的教授问“每次程序发现正在运行的服务时,它都必须打印消息”。从那以后,我想他想让我找出正在使用的端口。然而,我只是再次问他。他告诉我,我只需要检测一个空闲(未使用)的端口。

所以,我想我解决了我的问题。 感谢您的帮助。

【问题讨论】:

  • 你的意思是像nmap这样的东西吗? (nmap.org)。

标签: java port


【解决方案1】:
InetAddress addr = InetAddress.getByName("hostName");  
Socket socket = new Socket(addr, 8090);  

热门/试用的想法是尝试不同的端口。如果上面的代码 sn-p 没有抛出异常,那么主机正在接受该端口上的连接。如果不是,您将看到异常,通常是 ConnectException。 我并不是说这是一种理想的方式,但这只是一种选择。

【讨论】:

  • 是的,我知道如何找到空闲端口。但我想要的是找到一个有正在运行的服务的端口。
【解决方案2】:
public int getServiceByName(String tcpipService, String tcpipClass) {
    int port = -1;
    try {
        String line;
        BufferedReader br = new BufferedReader(
                    new InputStreamReader(
                       new FileInputStream(
                        "/etc/services")));
        while (((line = br.readLine()) != null)
                && (port == -1)) {
            if ((line.length() != 0)
                    && (line.charAt(0) != '#')) {
                port = parseServicesLine(line,
                    tcpipService, tcpipClass);
            }
        }   
        br.close();
        return (port); 
    } catch (IOException ioe) {
        return -1; 
    }
}   

private int parseServicesLine(String line,
        String tcpipService) {
    StringTokenizer st = new
        StringTokenizer(line, " \t/#");

    if (! st.hasMoreTokens()) {
        return -1; // error
    }
    String name = st.nextToken().trim();

    if (! st.hasMoreTokens()) {
        return -1; // error
    }
    String portValue = st.nextToken().trim();

    // Return port number, if name on this line matches:
    if (name.equals(tcpipService)) {
        try { 
            return (Integer.parseInt(portValue));
        } catch (NumberFormatException nfe) {
            return -1; 
        }
    } else {
        return -1; 
    }
}   

上面的代码 sn -p 根据服务名搜索 /etc/inet/services 文件并返回端口号。

【讨论】:

    【解决方案3】:

    尝试在命令提示符下使用 netstat 命令。您可以键入 netstat -h 来查看帮助,但 netstat -b 似乎会显示正在运行的进程。

    【讨论】:

      【解决方案4】:

      如果您的意思是在计算机上运行 Java 程序以检查该计算机的端口可用性,请查看此内容。

      Checking port availability in Java

      如果您的意思是使用 Java 程序从远程计算机获取端口信息,祝您好运。您可以尝试连接到不同的端口并检查哪些端口拒绝连接.. 但这是一个糟糕的主意。

      【讨论】:

      • 如果连接被拒绝,说明端口正在被使用?
      • 对不起,拒绝可能是错误的词。如果您尝试连接到不接受/侦听连接的 IP/端口,您将收到超时错误。具体来说,您可能会得到:java.net.ConnectException: Connection timed out: connect
      【解决方案5】:

      您要么必须在 java 中执行命令行参数(如 netstat),要么执行端口扫描。端口扫描还将检测您无法侦听的端口,即使它们未在使用中。例如,除非您是 root,否则您的系统可能不允许使用端口 443。

      类似:

      for(int port=0; port<65536; port++)
      {
          try
          {
              new ServerSocket(port);
              System.out.println("Successfully listend on port " + port);
              //clean up socket here
          }
          catch (IOException e)
          {
              System.out.println("Could not listen on port " + port);
          }
      }
      

      【讨论】:

      • “Could not listen on port”表示该端口上有服务运行?因为我想要的是检测该端口上是否有服务。
      • 这是为你自己的系统准备的。我相信他是在询问远程系统。这个基本代码仍然有效,除了您将使用客户端套接字并尝试连接到远程系统。
      • 对不起。我忘了从其中一个词中去掉“不”这个词。
      • 它无法识别我在 8080 上运行的 oracle