检查正在使用的端口

Posted

技术标签:

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

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

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

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

【问题讨论】:

你的意思是像nmap这样的东西吗? (nmap.org)。 【参考方案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

以上是关于检查正在使用的端口的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 中检查打开的端口?

如何使用 Windows 批处理文件检查端口 8086 是不是正在侦听

text 检查正在使用的端口

Linux中如何检查开放端口

Java如何检查端口是否被使用?

Linux查看端口详情lsof命令