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

时间:2013-03-30 13:03:59

标签: java networking webserver port

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

Sockets: Discover port availability using 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;
}

2 个答案:

答案 0 :(得分:2)

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

  1. 在'see'和'try'之间有一个时间窗口,在此期间情况可以改变(两种方式)。
  2. 无论如何,您仍然必须在“使用”部分捕捉失败。
  3. 基本上只是想预测未来。这应该是计算机科学,而不是算命。
  4. 这适用于'it'的大多数值,包括网络端口,文件,任何资源。

答案 1 :(得分: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));