为什么Java中的ServerSocket不同意netstat -ant?

时间:2017-04-12 12:16:19

标签: java

我在下面写了一个简单的Java方法来检查Portora 21是否在Fedora Linux中使用。它报告说它已经在使用中。

protected static boolean isPortInUseTCP(final int port)
{
    Log.info("Checking TCP ports [" + port + "]", Verbosity.MEDIUM);

    // Checks to see if the port is available (not in use), otherwise drop
    // into the catch block if it is already used
    try (ServerSocket ss = new ServerSocket(port))
    {
        ss.setReuseAddress(true);

        Log.info("Port number [" + port + "] not found via TCP port", Verbosity.MEDIUM);

        return false;
    }

    catch (IOException exc)
    {
        Log.info("Port number [" + port + "] found via TCP port", Verbosity.MEDIUM);
    }

    return true;
}

但是当检查netstat -ant以查看它是否与Java一致时,它不会像使用中那样显示端口21?为什么? enter image description here

2 个答案:

答案 0 :(得分:2)

您的Java代码未显示端口21是否正在使用中。它显示您是否可以在21上收听。由于21是一个特权端口,您获得的例外可能会抱怨缺少特权。

不要对异常做出假设。在这里你完全忽略了一个,假设它是关于正在使用的端口而不是没有所需的权限来监听该端口。

如果您将Java程序作为root运行(一个坏主意),您应该会看到该端口未被使用。

答案 1 :(得分:0)

是的,你说得对,Port 21是一个特权端口,例外有人抱怨 - java.net.BindException: Permission denied (Bind failed)

当我在root中运行程序时,我得到了正确的答案。它说港口没有使用。所以我的问题是,我首先没有把自己升级为正确的特权。谢谢你指出我的错误。