Вот класс, который я использовал, чтобы найти несколько свободных портов.Он обеспечивает гибкость для распределения отдельных портов в потоке некоторой сложной логики (т. Е. Когда, возможно, количество портов, которое вам нужно, не является простым числом, а зависит от сложной логики).Он по-прежнему гарантирует, что все порты, которые вы запрашиваете, являются бесплатными и уникальными (при условии, что вы используете один и тот же экземпляр этого класса для получения всех портов).
Таким образом, способ использования этого класса заключается в созданииэкземпляр.Выполните ваш код, чтобы сделать то, что вы хотите, чтобы выделить порты для использования этого экземпляра.Затем, после того как вы связали все порты, вы можете избавиться от этого экземпляра и использовать новый в следующий раз.
public class PortFinder {
/**
* If you only need the one port you can use this. No need to instantiate the class
*/
public static int findFreePort() throws IOException {
ServerSocket socket = new ServerSocket(0);
try {
return socket.getLocalPort();
} finally {
try {
socket.close();
} catch (IOException e) {
}
}
}
private HashSet<Integer> used = new HashSet<Integer>();
/**
* Finds a port that is currently free and is guaranteed to be different from any of the
* port numbers previously returned by this PortFinder instance.
*/
public synchronized int findUniqueFreePort() throws IOException {
int port;
do {
port = findFreePort();
} while (used.contains(port));
used.add(port);
return port;
}
}