2

我的情况:

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

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

问题:

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

  1. 创建一个新的套接字会导致端口被使用,我的其他线程将无法访问这个套接字。
  2. 使用 netstat 解析器会从项目中删除可移植性。

如果我忽略了stackoverflow的答案,请责备我无法搜索或其他东西,任何事情都会有帮助。

4

3 回答 3

5

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

不是纯Java。

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

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


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

于 2013-08-17T01:37:28.243 回答
1

只需尝试连接到它,然后休眠/重试几次,直到它成功。成功没有神奇的预言。

于 2013-08-17T03:10:16.147 回答
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

于 2013-08-17T00:49:28.280 回答