2

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

套接字:使用 Java 发现端口可用性

我有一个 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;
}
4

2 回答 2

2

这种性质的所有问题的正确答案是尝试使用它并捕获异常。不要尝试查看是否可用,然后尝试使用它仍然要处理异常,这有几个明显的问题:

  1. 在“看”和“尝试”之间有一个时间窗口,在此期间情况可以改变(双向)。
  2. 无论如何,您仍然必须在“使用”部分捕获故障。
  3. 它基本上只是试图预测未来。这应该是计算机科学,而不是算命。

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

于 2013-03-31T00:06:53.227 回答
1

我能够通过运行WampServer(通过访问 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));
于 2013-03-30T18:22:44.880 回答