最近我遇到了嵌入式 postgres库的问题。我试图通过手动选择一个空闲端口
new ServerSocket(0).getLocalPort()
但我在某个地方遇到了竞争条件(我的测试挂在第二个测试套件启动时)。
然后我了解到该库本身具有这种能力(使用随机端口)并且它没有我遇到的问题。我分析了源代码,我发现唯一的区别是他们做了额外的检查:
try (ServerSocket socket = new ServerSocket(0)) {
while(!socket.isBound()) {
Thread.sleep(50);
}
return socket.getLocalPort();
}
所以在端口被随机化后,他们等到它被绑定。我指的代码。
我想知道为什么有这段代码。我对“绑定”的理解是它等同于在给定端口上“监听”,但在这里情况并非如此,因为此代码在服务器启动之前运行。事实上,服务器将启动(并将自身绑定)到这个确切的端口。这让我很困惑。