在Java中检测端口可用性失败

在Java中检测端口可用性失败,java,networking,webserver,port,Java,Networking,Webserver,Port,我尝试使用以下方法检查端口80是否可用: 我有一个Java应用程序,它检查端口80是否可用,如果可用,它将运行一个小型web服务器,监听端口80。检测另一个Java应用程序是否侦听端口80非常有用,例如,如果我运行我的应用程序两次,第二个实例将正确地告诉我正在使用端口80 问题是,我让WAMP在端口80上运行和侦听,如果我在启动WAMP后运行Java应用程序,它不会告诉我端口80正忙。它似乎只告诉我另一个Java应用程序是否使用端口80 这超出了我的理解。。。非常感谢您的帮助 代码段: int

我尝试使用以下方法检查端口80是否可用:

我有一个Java应用程序,它检查端口80是否可用,如果可用,它将运行一个小型web服务器,监听端口80。检测另一个Java应用程序是否侦听端口80非常有用,例如,如果我运行我的应用程序两次,第二个实例将正确地告诉我正在使用端口80


问题是,我让WAMP在端口80上运行和侦听,如果我在启动WAMP后运行Java应用程序,它不会告诉我端口80正忙。它似乎只告诉我另一个Java应用程序是否使用端口80

这超出了我的理解。。。非常感谢您的帮助

代码段:

int port = 80;
if(!Connection.isPortAvailable(port)) {
    logger.info("Port " + port + " is already in use");
}
// in Connection class
public static boolean isPortAvailable(int port) {
    ServerSocket ss = null;
    DatagramSocket ds = null;
    try {
        ss = new ServerSocket(port);
        ss.setReuseAddress(true);
        ds = new DatagramSocket(port);
        ds.setReuseAddress(true);
        return true;
    } catch (IOException e) {
    } finally {
        if (ds != null) {
            ds.close();
        }

        if (ss != null) {
            try {
                ss.close();
            } catch (IOException e) {
                /* should not be thrown */
            }
        }
    }

    return false;
}

我可以通过运行(通过访问localhost:80验证它是否正在运行)和运行一个最小的java程序(给定您的示例代码)来重现您的问题

在WampServer运行时,try块中的代码未引发异常。但是,像这样修改try块的前几行

ss = new ServerSocket();
ss.bind(new InetSocketAddress("127.0.0.1", port));
isPortAvailable
将正确检测WampServer何时运行以及何时不运行。使用
“0.0.0.0”
而不是
“127.0.0.1”
对WampServer不起作用,但可以在IIS运行时正确检测。您可以通过关闭第一个插座来检查这两个

ss = new ServerSocket();
ss.bind(new InetSocketAddress("0.0.0.0", port));
ss.close();

ss = new ServerSocket();
ss.bind(new InetSocketAddress("127.0.0.1", port));

所有这类问题的正确答案都是尝试使用它并捕捉异常。不尝试查看它是否可用,然后尝试使用它,但仍然必须处理异常,这有几个明显的问题:

  • 在“查看”和“尝试”之间有一个时间窗口,在此期间,情况可以改变(两种方式)
  • 无论如何,您仍然必须捕获“使用”部分中的失败
  • 它基本上只是试图预测未来。这应该是计算机科学,而不是算命

  • 这适用于“it”的大多数值,包括网络端口、文件和任何资源。

    “它似乎只告诉我是否有其他Java应用程序使用端口80。”我对此深表怀疑。您确定吗?您使用的是哪种解决方案(Apache camel示例)?你能提供一个简短的代码片段吗?@leonbloy来证明你:我已经打开了WAMP。如果我访问例如localhost,WAMP将为请求提供服务。然后我启动Java应用程序,它并没有说端口80正忙。只有当我再次运行应用程序时(我现在有两个ISN),端口才忙。@KevinTonon我添加了代码段,也阅读了我上面对Leonblo的评论在链接的问题中,有一些评论说在某些情况下(OS-X,Java 7…)逻辑会失败。建议:如果您只需要找到一个未使用的端口来打开侦听服务器,请改用
    newserversocket(0)
    。应删除对getReuseAddress()的调用。在bind()之后已经太晚了,但无论如何,这与code.VG良好调查的意图相反+1.令人惊讶的是,OP绑定到0.0.0.0显然在WAMP绑定到127.0.0.1之后成功了。如果IP不同,则与同一端口的IP特定绑定可以共存,但与0.0.0.0的绑定不能与其中任何一个共存。我相信史蒂文斯(Stevens)中就是这么说的,TCP/IP在某处举例说明。时间窗口问题是一个很好的观点。端口可用性测试本身会短暂地连接一个侦听端口,因此可能会导致连接问题。这个测试对于一般用途来说可能还可以,但我不会在核电站控制系统中使用:)我根本不会使用它。这是糟糕的编程,它是额外的编程,100%冗余,并且您必须编写两批而不是一批错误处理。