Java - 检查端口是否正在使用而不连接它

时间:2013-08-17 00:44:57

标签: java multithreading java-native-interface

我的情况:

我有两个线程同时运行,一个线程想要等到另一个线程正在使用一个端口,该端口将在到达使用该端口的点之前运行一定数量的步骤。 / p>

我必须承诺的另一个限制是,在线程打开端口之前经过这些步骤的线程与其他线程没有轻松的通信,因为它是在使用API​​的JNI本机c代码中(希望不适用于问题,它通过一个大方法运行)

问题:

有没有办法让java能够等到端口正在使用?我查看了stackoverflow的解决方案,但它们有一些问题:

  1. 创建新套接字会导致端口被使用,我的其他线程将无法访问此套接字。
  2. 使用netstat解析器可以从项目中删除可移植性。
  3. 如果我忽略了stackoverflow的答案,请骂我无法搜索或其他什么,任何事情都会有所帮助。

3 个答案:

答案 0 :(得分:5)

  

java有没有办法等到端口正在使用?

不是纯Java。

但假设两个线程在同一个JVM中运行,它们可以通过其他方式进行通信。因此,您可以使用共享标志(例如,易失性布尔变量或AtomicBoolean)或CountDownLatchSemaphore。您可以使用其中任何一个来实现一个简单的地方,其中一个线程(实际上)告诉另一个线程正在使用该端口。

(事实上,如果你想让一个线程等待另一个线程,那么锁存器是最好的选择。)


这不是JNI中容易做到的事情。 AFAIK,netstat程序不使用普通的系统调用来执行此操作。我认为它使用“/ proc”树或(在旧实现中)直接访问内核内存以获取所需的信息。您可以在本机库中复制它,但我怀疑您会找到一个现有的库来执行此操作。当然,Windows实现将完全不同......

答案 1 :(得分:1)

您是否考虑或探讨了Apache camel?以下是来自apache camel的示例代码,用于检查端口可用性。代码非常简单和干净:

/**
 * Checks to see if a specific port is available.
 *
 * @param port the port to check for availability
 */
public static boolean available(int port) {
    if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) {
        throw new IllegalArgumentException("Invalid start port: " + 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;
}

代码来源:http://svn.apache.org/viewvc/camel/trunk/components/camel-test/src/main/java/org/apache/camel/test/AvailablePortFinder.java?view=markup#l130

答案 2 :(得分:1)

只是尝试连接到它,然后睡眠/重试几次,直到成功为止。没有成功的神奇预测。